<?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: Shraddha Khetmalis</title>
    <description>The latest articles on DEV Community by Shraddha Khetmalis (@shraddhaa9).</description>
    <link>https://dev.to/shraddhaa9</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%2F4156839%2F2299cd0b-de2b-431f-b660-f66ae2b0df31.jpeg</url>
      <title>DEV Community: Shraddha Khetmalis</title>
      <link>https://dev.to/shraddhaa9</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shraddhaa9"/>
    <language>en</language>
    <item>
      <title>Code2UML AI: The Code Determines the Architecture, Not the AI</title>
      <dc:creator>Shraddha Khetmalis</dc:creator>
      <pubDate>Mon, 05 Oct 2026 06:05:41 +0000</pubDate>
      <link>https://dev.to/shraddhaa9/code2uml-ai-the-code-determines-the-architecture-not-the-ai-3ac9</link>
      <guid>https://dev.to/shraddhaa9/code2uml-ai-the-code-determines-the-architecture-not-the-ai-3ac9</guid>
      <description>&lt;p&gt;This is a submission for the &lt;a href="https://dev.to/challenges/hacktoberfest-weekend-2026-10-01"&gt;Hacktoberfest Weekend Challenge: Build for a Friend&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  🚀 What I Built
&lt;/h2&gt;

&lt;p&gt;I built an AI code explainer that &lt;strong&gt;doesn't let the AI decide what the architecture is&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Rahul is a friend and a regular collaborator on my projects. While working through an unfamiliar Spring Boot codebase, he ran into a problem that has nothing to do with syntax or writing code.&lt;/p&gt;

&lt;p&gt;He couldn't easily see the bigger picture.&lt;/p&gt;

&lt;p&gt;Which controller talks to which service?&lt;br&gt;
Which repository sits behind that service?&lt;br&gt;
Which entity is being used?&lt;br&gt;
What endpoints does the application expose?&lt;br&gt;
Where does a particular class fit in the overall structure?&lt;/p&gt;

&lt;p&gt;In a small project, you can trace those relationships manually. In a larger Java codebase, that quickly becomes tedious, especially when you are seeing the project for the first time.&lt;/p&gt;

&lt;p&gt;My first idea was straightforward: build a chatbot that reads the repository and explains it.&lt;/p&gt;

&lt;p&gt;Then I changed the design.&lt;/p&gt;

&lt;p&gt;I wanted the architecture to be &lt;strong&gt;derived from the source code first&lt;/strong&gt;, rather than reconstructed by an LLM from raw code.&lt;/p&gt;

&lt;p&gt;So I built &lt;strong&gt;Code2UML AI&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The system accepts a Spring Boot &lt;code&gt;.zip&lt;/code&gt;, analyzes the Java source using deterministic static analysis, converts the extracted relationships into structured architecture data, and renders that data as interactive Mermaid diagrams.&lt;/p&gt;

&lt;p&gt;An optional Gemma-powered assistant then answers questions about the architecture.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;The code determines the architecture. Gemma explains it.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That separation is the core idea behind the project.&lt;/p&gt;

&lt;p&gt;I gave the tool to Rahul to test the actual goal: could it make an unfamiliar Spring Boot project easier to understand?&lt;/p&gt;

&lt;p&gt;The success criterion wasn't a flashy interface.&lt;/p&gt;

&lt;p&gt;It was much simpler:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Can someone go from “I don't understand this codebase” to “I can see how these pieces fit together”?&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That's what Code2UML AI is built to help with.&lt;/p&gt;


&lt;h2&gt;
  
  
  💻 Try the Demo
&lt;/h2&gt;

&lt;p&gt;🔗 &lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://code2uml.onrender.com/" rel="noopener noreferrer"&gt;https://code2uml.onrender.com/&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;The public version is deployed on Render using Hacktoberfest Render credits.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;⚠️ &lt;strong&gt;Privacy note:&lt;/strong&gt; This is a public deployment. Use the included sample project for evaluation. Do not upload proprietary or sensitive source code to the public instance. For private projects, run Code2UML locally and use a local model endpoint.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;h3&gt;
  
  
  Try it in about a minute
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt;Click &lt;strong&gt;Try Sample Project&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt;Review the &lt;strong&gt;Architecture Observations&lt;/strong&gt; panel.&lt;/li&gt;
&lt;li&gt;Open the &lt;strong&gt;Endpoints&lt;/strong&gt; tab.&lt;/li&gt;
&lt;li&gt;Explore the Controller → Service → Repository → Entity relationships.&lt;/li&gt;
&lt;li&gt;Ask the Architecture Assistant questions such as:&lt;/li&gt;
&lt;/ol&gt;

&lt;ul&gt;
&lt;li&gt;&lt;em&gt;Which service handles UserController?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;&lt;em&gt;What repository is connected to UserServiceImpl?&lt;/em&gt;&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Is there an authentication component?&lt;/em&gt;

&lt;ol&gt;
&lt;li&gt;Compare the answer with the generated architecture and the sample source code.&lt;/li&gt;
&lt;/ol&gt;
&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The sample project contains:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;UserController&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserService&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserServiceImpl&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserRepository&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;User&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;UserDTO&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;DemoApplication&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The fixture produces &lt;strong&gt;7 detected types, 6 packages, 4 REST endpoints, and 10 deduplicated architectural relationships&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Those expected results are also covered by the automated tests.&lt;/p&gt;
&lt;h3&gt;
  
  
  Screenshots
&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhn8cba0myl3f46fwt8gm.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fhn8cba0myl3f46fwt8gm.png" alt="Code2UML AI dashboard with the sample Spring Boot project loaded" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The dashboard with the sample project loaded. It shows the detected types, REST endpoints, relationships, rule-based observations, and analysis coverage. Coverage means the files were parsed; it is not a guarantee that every relationship was recovered.&lt;/em&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F95qj1hm9z5t5wg82r4b0.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F95qj1hm9z5t5wg82r4b0.png" alt="Layered architecture view with the Architecture Assistant" width="800" height="455"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The layered architecture view showing controllers, services, repositories, entities, and DTOs alongside the Architecture Assistant. The selector can switch between the full architecture and a focused controller view.&lt;/em&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdo3ybd8w4eg1uogpbeje.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2Fdo3ybd8w4eg1uogpbeje.png" alt="UML class view of the sample project" width="800" height="753"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The UML class view generated from the extracted architecture JSON, including stereotypes, fields, methods, realization edges, and dependency relationships.&lt;/em&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6a5cd07ctkojn6yqwdm7.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F6a5cd07ctkojn6yqwdm7.png" alt="Endpoints tab listing the extracted REST routes" width="800" height="418"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The endpoint catalog showing HTTP method, route, controller, handler method, and return type.&lt;/em&gt;&lt;/p&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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F23yoqhhndt4sv6eg54av.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.us-east-2.amazonaws.com%2Fuploads%2Farticles%2F23yoqhhndt4sv6eg54av.png" alt="Architecture Assistant answers labeled by engine" width="572" height="732"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;em&gt;The Architecture Assistant identifies which engine produced each answer. The authentication question returns “not detected” rather than inventing a component, and the response is limited to the analyzed project.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;The &lt;strong&gt;Copy Mermaid&lt;/strong&gt; action lets you export the generated diagram directly into a README or other documentation.&lt;/p&gt;


&lt;h2&gt;
  
  
  🔗 Source Code
&lt;/h2&gt;


&lt;div class="ltag-github-readme-tag"&gt;
  &lt;div class="readme-overview"&gt;
    &lt;h2&gt;
      &lt;img src="https://assets.dev.to/assets/github-logo-5a155e1f9a670af7944dd5e12375bc76ed542ea80224905ecaf878b9157cdefc.svg" alt="GitHub logo"&gt;
      &lt;a href="https://github.com/shraddhaa09" rel="noopener noreferrer"&gt;
        shraddhaa09
      &lt;/a&gt; / &lt;a href="https://github.com/shraddhaa09/code2uml" rel="noopener noreferrer"&gt;
        code2uml
      &lt;/a&gt;
    &lt;/h2&gt;
    &lt;h3&gt;
      
    &lt;/h3&gt;
  &lt;/div&gt;
  &lt;div class="ltag-github-body"&gt;
    
&lt;div id="readme" class="md"&gt;&lt;div class="markdown-heading"&gt;
&lt;h1 class="heading-element"&gt;⚡ Code2UML AI&lt;/h1&gt;
&lt;/div&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Deterministic Spring Boot architecture visualizer with an optional Gemma-powered assistant.&lt;/strong&gt;
The code determines the architecture. Gemma explains it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;a href="https://code2uml.onrender.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/86ad870f51e6bb13d2caf4e91e98bd1dcb7aed55a1efaf1fc45d1fcdb9b09c71/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6976655f44656d6f2d52656e6465722d3436453342373f6c6f676f3d72656e646572266c6f676f436f6c6f723d7768697465" alt="Live Demo"&gt;&lt;/a&gt;
&lt;a href="https://github.com/shraddhaa09/code2uml/LICENSE" rel="noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/fdf2982b9f5d7489dcf44570e714e3a15fce6253e0cc6b5aa61a075aac2ff71b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4c6963656e73652d4d49542d79656c6c6f772e737667" alt="License: MIT"&gt;&lt;/a&gt;
&lt;a href="https://www.python.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/6b71391af58519b14b69d51c95f0723c54590f57547f17c2db9d4486b2ad8f69/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f507974686f6e2d332e31322d626c75652e7376673f6c6f676f3d707974686f6e266c6f676f436f6c6f723d7768697465" alt="Python"&gt;&lt;/a&gt;
&lt;a href="https://fastapi.tiangolo.com/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/cb755bd327b526d4356ed57866053a142bdc6b9060b04ff02c17340986030ecb/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f466173744150492d302e3131312e302d3030393638382e7376673f6c6f676f3d66617374617069266c6f676f436f6c6f723d7768697465" alt="FastAPI"&gt;&lt;/a&gt;
&lt;a href="https://mermaid.js.org/" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/e128594d57902a56e773e42697de6273c06e86f1693bb9f4f4e6076ca321428b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f4d65726d6169642e6a732d31302e782d6666333637302e737667" alt="Mermaid.js"&gt;&lt;/a&gt;
&lt;a href="https://ai.google.dev/gemma" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/df54637819a0666047c63abafc0e830f236c13f4f964f201c282a5f80bb0aa0b/68747470733a2f2f696d672e736869656c64732e696f2f62616467652f47656d6d612d6f70656e2d2d7765696768742d3865373566662e737667" alt="Gemma"&gt;&lt;/a&gt;
&lt;a href="https://render.com/deploy?repo=https://github.com/shraddhaa09/code2uml" rel="nofollow noopener noreferrer"&gt;&lt;img src="https://camo.githubusercontent.com/c3053e93bc9f0a2cd84050a5ff9f07cc5e639621a72e50dce48781f4a38f10e2/68747470733a2f2f72656e6465722e636f6d2f696d616765732f6465706c6f792d746f2d72656e6465722d627574746f6e2e737667" alt="Deploy to Render"&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Live demo:&lt;/strong&gt; &lt;a href="https://code2uml.onrender.com/" rel="nofollow noopener noreferrer"&gt;code2uml.onrender.com&lt;/a&gt; · &lt;strong&gt;Source:&lt;/strong&gt; &lt;a href="https://github.com/shraddhaa09/code2uml" rel="noopener noreferrer"&gt;github.com/shraddhaa09/code2uml&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;⚠️ The hosted demo is a public deployment. &lt;strong&gt;Use the built-in sample project and do not upload proprietary or sensitive source code.&lt;/strong&gt; For private code, run it locally (see &lt;a href="https://github.com/shraddhaa09/code2uml#quick-start" rel="noopener noreferrer"&gt;Quick Start&lt;/a&gt;).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Contents&lt;/h2&gt;
&lt;/div&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#problem" rel="noopener noreferrer"&gt;Problem&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#solution" rel="noopener noreferrer"&gt;Solution&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#try-it" rel="noopener noreferrer"&gt;Try it&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#architecture" rel="noopener noreferrer"&gt;Architecture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#privacy-and-data-flow" rel="noopener noreferrer"&gt;Privacy and data flow&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#tech-stack" rel="noopener noreferrer"&gt;Tech stack&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#quick-start" rel="noopener noreferrer"&gt;Quick start&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#running-with-local-gemma-ollama" rel="noopener noreferrer"&gt;Running with local Gemma (Ollama)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#deployment-on-render" rel="noopener noreferrer"&gt;Deployment on Render&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#running-tests" rel="noopener noreferrer"&gt;Running tests&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#supported-constructs" rel="noopener noreferrer"&gt;Supported constructs&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#performance" rel="noopener noreferrer"&gt;Performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#known-limitations" rel="noopener noreferrer"&gt;Known limitations&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#api-endpoints" rel="noopener noreferrer"&gt;API endpoints&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#sample-fixture" rel="noopener noreferrer"&gt;Sample fixture&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#project-layout" rel="noopener noreferrer"&gt;Project layout&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#contributing" rel="noopener noreferrer"&gt;Contributing&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://github.com/shraddhaa09/code2uml#license" rel="noopener noreferrer"&gt;License&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="markdown-heading"&gt;
&lt;h2 class="heading-element"&gt;Problem&lt;/h2&gt;
&lt;/div&gt;
&lt;p&gt;Understanding a medium-to-large Spring Boot codebase is slow. Developers trace dependency-injection graphs by hand, hunt for REST endpoints across controllers, map JPA entities to repositories, and draw architecture diagrams manually. Many teams also cannot send proprietary source code to a hosted LLM, which rules out the obvious "paste it into a chatbot" shortcut.&lt;/p&gt;
&lt;div class="markdown-heading"&gt;…&lt;/div&gt;&lt;/div&gt;
  &lt;/div&gt;
  &lt;div class="gh-btn-container"&gt;&lt;a class="gh-btn" href="https://github.com/shraddhaa09/code2uml" rel="noopener noreferrer"&gt;View on GitHub&lt;/a&gt;&lt;/div&gt;
&lt;/div&gt;


&lt;p&gt;The repository includes the backend, frontend, sample Spring Boot project, automated tests, and local setup instructions.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏗️ How Code2UML AI Works
&lt;/h2&gt;

&lt;p&gt;The system is built around one architectural rule:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Static analysis establishes the structure. AI explains that structure.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;The pipeline is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Spring Boot ZIP
      ↓
Safe archive extraction
      ↓
Deterministic Java analysis
(javalang AST + tokenizer/regex fallback)
      ↓
Structured architecture JSON
      ↓
Mermaid architecture + UML diagrams
      ↓
Endpoints + observations + component catalog
      ↓
Architecture Assistant
      ↓
Deterministic engine OR Gemma
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  1. Safe ZIP extraction
&lt;/h3&gt;

&lt;p&gt;The FastAPI backend accepts a Spring Boot project as a ZIP archive.&lt;/p&gt;

&lt;p&gt;Before extraction, the archive is validated against unsafe conditions such as path traversal and oversized or suspicious archives. Files are extracted into a temporary working directory before analysis.&lt;/p&gt;

&lt;p&gt;The upload pipeline also enforces an archive-size limit.&lt;/p&gt;

&lt;p&gt;The goal is simple: make repository analysis convenient without treating an uploaded archive as inherently trustworthy.&lt;/p&gt;

&lt;h3&gt;
  
  
  2. Deterministic Java analysis
&lt;/h3&gt;

&lt;p&gt;The analyzer looks for architectural signals directly in the source code.&lt;/p&gt;

&lt;p&gt;It can identify things such as:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;code&gt;@RestController&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Controller&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Service&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Repository&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Entity&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;@Table&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;DTOs&lt;/li&gt;
&lt;li&gt;Constructor injection&lt;/li&gt;
&lt;li&gt;Field injection&lt;/li&gt;
&lt;li&gt;REST endpoint mappings&lt;/li&gt;
&lt;li&gt;Repository-to-entity relationships&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The primary parser uses &lt;code&gt;javalang&lt;/code&gt; for Java AST analysis.&lt;/p&gt;

&lt;p&gt;When the AST parser cannot handle a particular source construct, the analyzer can fall back to deterministic token and regex-based parsing.&lt;/p&gt;

&lt;p&gt;There is &lt;strong&gt;no LLM in this stage&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;That is important because the architecture should not depend on an AI model guessing what a class probably means.&lt;/p&gt;

&lt;h3&gt;
  
  
  3. Structured architecture
&lt;/h3&gt;

&lt;p&gt;The extracted information is normalized into structured JSON.&lt;/p&gt;

&lt;p&gt;A simplified example looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"roles"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"controllers"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"UserController"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"services"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"UserServiceImpl"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"repositories"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"UserRepository"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"entities"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"User"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="nl"&gt;"dtos"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;"UserDTO"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;},&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"dependencies"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"source"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UserController"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"target"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UserService"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"type"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"injected"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"endpoints"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"method"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"GET"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"path"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"/api/users"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
      &lt;/span&gt;&lt;span class="nl"&gt;"controller"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"UserController"&lt;/span&gt;&lt;span class="w"&gt;
    &lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This JSON becomes the structured representation used by the rest of the application.&lt;/p&gt;

&lt;p&gt;Instead of asking a model to rediscover the architecture every time someone asks a question, the application can work from the same extracted representation.&lt;/p&gt;

&lt;h3&gt;
  
  
  4. Turning structure into diagrams
&lt;/h3&gt;

&lt;p&gt;The architecture JSON is transformed into Mermaid representations for both architectural and UML-style views.&lt;/p&gt;

&lt;p&gt;The frontend supports:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Interactive diagrams&lt;/li&gt;
&lt;li&gt;Pan and zoom&lt;/li&gt;
&lt;li&gt;Full and focused views&lt;/li&gt;
&lt;li&gt;Endpoint inspection&lt;/li&gt;
&lt;li&gt;Component inspection&lt;/li&gt;
&lt;li&gt;Raw JSON inspection&lt;/li&gt;
&lt;li&gt;Mermaid copying&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For larger graphs, the application can limit displayed edges so that the visualization remains usable rather than turning into an unreadable wall of connections.&lt;/p&gt;

&lt;h3&gt;
  
  
  5. Rule-based architectural observations
&lt;/h3&gt;

&lt;p&gt;Not every useful insight needs AI.&lt;/p&gt;

&lt;p&gt;Code2UML AI also generates deterministic observations from the extracted structure.&lt;/p&gt;

&lt;p&gt;Examples include:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Entities exposed directly through controllers&lt;/li&gt;
&lt;li&gt;Skipped architectural layers&lt;/li&gt;
&lt;li&gt;Service interfaces without implementations&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;These checks run without an LLM.&lt;/p&gt;

&lt;p&gt;That means the core architecture analysis remains useful even when no AI model is configured.&lt;/p&gt;

&lt;h3&gt;
  
  
  6. The Architecture Assistant
&lt;/h3&gt;

&lt;p&gt;Gemma is used at the explanation layer.&lt;/p&gt;

&lt;p&gt;The assistant can answer architecture-focused questions such as:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Which service is connected to UserController?”&lt;/p&gt;

&lt;p&gt;“What repository does UserServiceImpl use?”&lt;/p&gt;

&lt;p&gt;“Is there an authentication component?”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;There are two ways to answer those questions.&lt;/p&gt;

&lt;p&gt;The deterministic engine handles supported architecture queries directly from the extracted structure.&lt;/p&gt;

&lt;p&gt;When Gemma is configured, it receives the structured architecture as context and generates a natural-language response.&lt;/p&gt;

&lt;p&gt;The important distinction is that Gemma is &lt;strong&gt;not asked to reconstruct the entire repository from raw source code&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;The architecture has already been extracted.&lt;/p&gt;

&lt;p&gt;The model is explaining the result.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;                 ┌──────────────────────┐
                 │  Structured Analysis │
                 │        JSON          │
                 └──────────┬───────────┘
                            │
                ┌───────────┴───────────┐
                ↓                       ↓
      Deterministic Engine          Gemma
                ↓                       ↓
       Architecture answers    Natural-language answers
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;When Gemma is unavailable, the deterministic engine remains available for supported questions.&lt;/p&gt;

&lt;h3&gt;
  
  
  7. Coverage and diagnostics
&lt;/h3&gt;

&lt;p&gt;Static analysis is not perfect, so the application exposes parsing diagnostics instead of pretending that every file and relationship was understood completely.&lt;/p&gt;

&lt;p&gt;The project tracks successful parsing, fallback parsing, failed files, and other analysis information.&lt;/p&gt;

&lt;p&gt;This makes an important limitation visible:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If the analyzer cannot confidently extract something, the system should expose that limitation rather than silently presenting an incomplete graph as a complete one.&lt;/p&gt;
&lt;/blockquote&gt;




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

&lt;p&gt;The repository currently contains a &lt;strong&gt;21-test suite&lt;/strong&gt; covering unit, integration, and browser-level behavior.&lt;/p&gt;

&lt;p&gt;The tests cover areas including:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Golden sample project analysis&lt;/li&gt;
&lt;li&gt;Expected type detection&lt;/li&gt;
&lt;li&gt;Relationship deduplication&lt;/li&gt;
&lt;li&gt;REST endpoint extraction&lt;/li&gt;
&lt;li&gt;Mermaid generation&lt;/li&gt;
&lt;li&gt;Full and default diagram views&lt;/li&gt;
&lt;li&gt;Controller endpoint limits&lt;/li&gt;
&lt;li&gt;Gemma grounding&lt;/li&gt;
&lt;li&gt;Database-vendor detection&lt;/li&gt;
&lt;li&gt;Missing-component responses&lt;/li&gt;
&lt;li&gt;Direct and indirect dependency questions&lt;/li&gt;
&lt;li&gt;Privacy boundaries&lt;/li&gt;
&lt;li&gt;Playwright browser flows&lt;/li&gt;
&lt;li&gt;Sample-project loading&lt;/li&gt;
&lt;li&gt;Chat Q&amp;amp;A&lt;/li&gt;
&lt;li&gt;Empty ZIP handling&lt;/li&gt;
&lt;li&gt;Corrupt ZIP handling&lt;/li&gt;
&lt;li&gt;Missing Java-file handling&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The sample fixture is specifically checked for:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;7 detected types + 10 deduplicated relationships + 6 packages + 4 REST endpoints&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;These tests are meant to verify known behavior on controlled fixtures.&lt;/p&gt;

&lt;p&gt;They are &lt;strong&gt;not&lt;/strong&gt; presented as a benchmark for large production repositories.&lt;/p&gt;




&lt;h2&gt;
  
  
  ⚠️ Known Limitations
&lt;/h2&gt;

&lt;p&gt;Code2UML AI is a static-analysis tool. It is not a complete Java program-understanding system.&lt;/p&gt;

&lt;p&gt;There are several important limitations.&lt;/p&gt;

&lt;p&gt;Static analysis can miss relationships that depend on runtime behavior, dynamic wiring, generated code, reflection, or other information that is not directly visible in the analyzed source.&lt;/p&gt;

&lt;p&gt;Multi-module projects can be analyzed when their relevant Java source is included in the uploaded archive.&lt;/p&gt;

&lt;p&gt;The generated diagrams represent extracted structure. They are not runtime execution traces.&lt;/p&gt;

&lt;p&gt;Gemma can still produce incorrect answers. Supplying structured architecture instead of raw source narrows the problem, but it does not eliminate model errors.&lt;/p&gt;

&lt;p&gt;The deterministic assistant only understands the architectural signals it has been designed to extract.&lt;/p&gt;

&lt;p&gt;And the public deployment has different privacy properties from a local deployment.&lt;/p&gt;

&lt;p&gt;I would rather make those limitations explicit than claim that AI or static analysis can perfectly understand every Spring Boot application.&lt;/p&gt;




&lt;h2&gt;
  
  
  🌍 Why Open Models Matter Here
&lt;/h2&gt;

&lt;p&gt;Code2UML AI uses &lt;strong&gt;Gemma 4&lt;/strong&gt;, with &lt;strong&gt;Gemma 4 26B A4B IT&lt;/strong&gt; used for the natural-language Architecture Assistant through the Google API integration.&lt;/p&gt;

&lt;p&gt;The important part is not simply adding a model to the application.&lt;/p&gt;

&lt;p&gt;The model is integrated into a system where the architecture itself is established independently.&lt;/p&gt;

&lt;p&gt;That creates a clear separation:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source Code
    ↓
Deterministic Analyzer
    ↓
Structured Architecture
    ↓
Chosen AI Model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;rather than:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Source Code
    ↓
One AI Model
    ↓
"Trust the explanation"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Local inference
&lt;/h3&gt;

&lt;p&gt;The repository also supports OpenAI-compatible local endpoints such as Ollama.&lt;/p&gt;

&lt;p&gt;That makes this possible:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Local Code2UML
      ↓
Local static analysis
      ↓
Structured architecture
      ↓
Local Gemma
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;For developers working with sensitive code, this provides a path toward keeping both analysis and inference on their own machine.&lt;/p&gt;

&lt;h3&gt;
  
  
  Model independence
&lt;/h3&gt;

&lt;p&gt;The AI endpoint and model are configurable through environment variables.&lt;/p&gt;

&lt;p&gt;The deterministic analyzer does not need to be redesigned just because the inference provider changes.&lt;/p&gt;

&lt;p&gt;The architecture remains:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Code → Analyzer → Structured Architecture
                         ↓
                    Chosen Model
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The model is replaceable because it is not the component responsible for discovering the architecture.&lt;/p&gt;

&lt;h3&gt;
  
  
  AI is optional
&lt;/h3&gt;

&lt;p&gt;This is one of the most important design decisions in the project.&lt;/p&gt;

&lt;p&gt;Without an external AI model, Code2UML AI can still:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Parse Java projects&lt;/li&gt;
&lt;li&gt;Identify Spring components&lt;/li&gt;
&lt;li&gt;Extract endpoints&lt;/li&gt;
&lt;li&gt;Build architecture diagrams&lt;/li&gt;
&lt;li&gt;Generate rule-based observations&lt;/li&gt;
&lt;li&gt;Answer supported architecture questions deterministically&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Gemma adds natural-language exploration.&lt;/p&gt;

&lt;p&gt;It does not become the source of truth.&lt;/p&gt;




&lt;h2&gt;
  
  
  🔐 Privacy Model
&lt;/h2&gt;

&lt;p&gt;Privacy depends on how Code2UML AI is deployed.&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Deployment&lt;/th&gt;
&lt;th&gt;Code analysis&lt;/th&gt;
&lt;th&gt;AI inference&lt;/th&gt;
&lt;th&gt;Data leaving the machine&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;Local + local Gemma&lt;/td&gt;
&lt;td&gt;Local&lt;/td&gt;
&lt;td&gt;Local&lt;/td&gt;
&lt;td&gt;None to an external AI provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Local + hosted Gemma&lt;/td&gt;
&lt;td&gt;Local&lt;/td&gt;
&lt;td&gt;External provider&lt;/td&gt;
&lt;td&gt;Structured architecture context is sent to the configured provider&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;Public Render demo&lt;/td&gt;
&lt;td&gt;Render server&lt;/td&gt;
&lt;td&gt;External Gemma API&lt;/td&gt;
&lt;td&gt;The uploaded ZIP reaches the Render server, and structured context may be sent to the configured AI provider&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;That means the public demo should &lt;strong&gt;not&lt;/strong&gt; be treated as a private deployment.&lt;/p&gt;

&lt;p&gt;For proprietary or sensitive projects, the intended approach is to run Code2UML locally and connect it to a local model endpoint.&lt;/p&gt;

&lt;p&gt;The analyzer itself does not require an AI model to construct the architecture.&lt;/p&gt;

&lt;p&gt;That separation is deliberate.&lt;/p&gt;




&lt;h2&gt;
  
  
  🏆 Best Use of Gemma
&lt;/h2&gt;

&lt;p&gt;The interesting part of the Gemma integration is not that Code2UML has a chatbot.&lt;/p&gt;

&lt;p&gt;It is &lt;strong&gt;what the chatbot is given&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;Gemma is provided with structured architectural information produced by deterministic analysis rather than being asked to infer the entire application architecture from raw source code.&lt;/p&gt;

&lt;p&gt;That creates a clear division of responsibility:&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Static analysis extracts the facts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Gemma explains those facts.&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;For example, the system can extract:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;UserController
      ↓
UserService
      ↓
UserRepository
      ↓
User
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;and Gemma can turn that structure into an explanation a developer can understand.&lt;/p&gt;

&lt;p&gt;When Gemma is unavailable, the deterministic engine can still answer supported architecture questions.&lt;/p&gt;

&lt;p&gt;The model is therefore an explanation layer, not the system of record.&lt;/p&gt;




&lt;h2&gt;
  
  
  ☁️ Best Use of Render
&lt;/h2&gt;

&lt;p&gt;Code2UML AI is deployed as a live web application on Render so judges and developers can try the project without setting up the entire stack locally.&lt;/p&gt;

&lt;p&gt;The repository includes a Render Blueprint, and the application exposes a health endpoint at:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;/api/health
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;The hosted flow is:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Browser
   ↓
Render Web Service
   ↓
FastAPI
   ↓
Deterministic Spring Boot Analyzer
   ↓
Structured Architecture
   ↓
Gemma API
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;This makes the project immediately testable from the browser while keeping the local setup available for developers who need a private deployment.&lt;/p&gt;

&lt;p&gt;The public demo intentionally uses the included sample project rather than asking users to upload sensitive repositories.&lt;/p&gt;




&lt;h2&gt;
  
  
  🎯 Why I Built It This Way
&lt;/h2&gt;

&lt;p&gt;The most important decision in Code2UML AI was deciding what the model &lt;strong&gt;should not be responsible for&lt;/strong&gt;.&lt;/p&gt;

&lt;p&gt;A general-purpose AI code assistant can read a repository and produce an explanation that sounds convincing.&lt;/p&gt;

&lt;p&gt;But a convincing explanation is not necessarily a structurally correct one.&lt;/p&gt;

&lt;p&gt;So instead of asking:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“AI, understand this entire Spring Boot project.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Code2UML AI asks a narrower question:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“Here is the architecture extracted from the code. Now explain it.”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;That changes the role of the model.&lt;/p&gt;

&lt;p&gt;The architecture is established first.&lt;/p&gt;

&lt;p&gt;The model explains it second.&lt;/p&gt;

&lt;p&gt;For Rahul, that means the first step into an unfamiliar codebase can start with a visual map rather than dozens of unrelated Java files.&lt;/p&gt;

&lt;p&gt;And that is the real reason I built this.&lt;/p&gt;

&lt;p&gt;Not to replace reading code.&lt;/p&gt;

&lt;p&gt;Not to pretend static analysis is perfect.&lt;/p&gt;

&lt;p&gt;Not to let an LLM confidently invent relationships.&lt;/p&gt;

&lt;p&gt;Just to make the first hour inside an unfamiliar Spring Boot project a lot less painful.&lt;/p&gt;

&lt;p&gt;The next feature I want to explore is deeper request-flow tracing, where Code2UML AI can follow a specific endpoint from controller through service and repository layers instead of only showing the extracted relationships.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The code determines the structure. AI helps explain it.&lt;/strong&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>weekendchallenge</category>
      <category>hf26challenge</category>
      <category>springboot</category>
    </item>
  </channel>
</rss>
