<?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: Swarna</title>
    <description>The latest articles on DEV Community by Swarna (@sweety717).</description>
    <link>https://dev.to/sweety717</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%2F4066834%2Fe2f5e9c7-7608-4a07-9ae5-67642bdafd71.png</url>
      <title>DEV Community: Swarna</title>
      <link>https://dev.to/sweety717</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/sweety717"/>
    <language>en</language>
    <item>
      <title>I Built 3 AI Products with Spring Boot — Here’s What I Learned</title>
      <dc:creator>Swarna</dc:creator>
      <pubDate>Fri, 14 Aug 2026 15:32:45 +0000</pubDate>
      <link>https://dev.to/sweety717/i-built-3-ai-products-with-spring-boot-heres-what-i-learned-26em</link>
      <guid>https://dev.to/sweety717/i-built-3-ai-products-with-spring-boot-heres-what-i-learned-26em</guid>
      <description>&lt;p&gt;I got tired of building the same CRUD applications.&lt;/p&gt;

&lt;p&gt;So instead of creating another simple Employee Management System or To-Do application, I decided to build something that felt closer to a real product.&lt;/p&gt;

&lt;p&gt;Over the last few weeks, I built three AI-powered applications using Spring Boot:&lt;/p&gt;

&lt;p&gt;🤖 AI Code Reviewer for GitHub Pull Requests&lt;br&gt;
📄 AI Resume Analyzer&lt;br&gt;
💬 Self-Hosted AI Support Widget&lt;/p&gt;

&lt;p&gt;Each project started with a simple idea:&lt;/p&gt;

&lt;p&gt;Can I build something useful with the backend technologies I already know instead of just building projects for a tutorial?&lt;/p&gt;

&lt;p&gt;The answer turned out to be yes.&lt;/p&gt;

&lt;p&gt;But the most valuable part wasn't actually finishing the applications.&lt;/p&gt;

&lt;p&gt;It was everything I learned while building them.&lt;/p&gt;

&lt;p&gt;Why I Chose Spring Boot&lt;/p&gt;

&lt;p&gt;I've been working with Java and Spring Boot, so I wanted to see how far I could take the stack when combined with AI.&lt;/p&gt;

&lt;p&gt;When people talk about AI applications, the conversation often revolves around Python, machine learning models, notebooks, and data science.&lt;/p&gt;

&lt;p&gt;But there is another side to AI:&lt;/p&gt;

&lt;p&gt;The application layer.&lt;/p&gt;

&lt;p&gt;You still need:&lt;/p&gt;

&lt;p&gt;REST APIs&lt;br&gt;
Authentication&lt;br&gt;
Database integration&lt;br&gt;
External API communication&lt;br&gt;
Request validation&lt;br&gt;
Error handling&lt;br&gt;
File processing&lt;br&gt;
Business logic&lt;br&gt;
Logging&lt;br&gt;
Configuration&lt;br&gt;
Deployment&lt;/p&gt;

&lt;p&gt;And that's where Spring Boot becomes extremely useful.&lt;/p&gt;

&lt;p&gt;The AI model might generate the intelligence, but the backend is what turns that intelligence into an actual product.&lt;/p&gt;

&lt;p&gt;Product 1: AI Code Reviewer for GitHub Pull Requests&lt;/p&gt;

&lt;p&gt;The first product I built was an AI-powered code reviewer for GitHub Pull Requests.&lt;/p&gt;

&lt;p&gt;The idea was simple:&lt;/p&gt;

&lt;p&gt;Instead of manually going through every changed file in a Pull Request, why not let an AI analyze the changes and provide useful feedback?&lt;/p&gt;

&lt;p&gt;The basic flow&lt;br&gt;
GitHub Pull Request&lt;br&gt;
        ↓&lt;br&gt;
Fetch PR information&lt;br&gt;
        ↓&lt;br&gt;
Get changed code&lt;br&gt;
        ↓&lt;br&gt;
Prepare review prompt&lt;br&gt;
        ↓&lt;br&gt;
AI analysis&lt;br&gt;
        ↓&lt;br&gt;
Generate review&lt;br&gt;
        ↓&lt;br&gt;
Return useful feedback&lt;/p&gt;

&lt;p&gt;The AI isn't just being asked:&lt;/p&gt;

&lt;p&gt;"Is this code good?"&lt;/p&gt;

&lt;p&gt;The goal is to make the review more useful by looking for things developers actually care about.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Potential bugs&lt;br&gt;
Code quality problems&lt;br&gt;
Security concerns&lt;br&gt;
Performance issues&lt;br&gt;
Maintainability&lt;br&gt;
Bad practices&lt;br&gt;
Possible improvements&lt;br&gt;
What I Learned From This Project&lt;/p&gt;

&lt;p&gt;The biggest lesson was:&lt;/p&gt;

&lt;p&gt;AI output is only as good as the context you give it.&lt;/p&gt;

&lt;p&gt;Initially, it is tempting to simply send a piece of code to an AI model and ask:&lt;/p&gt;

&lt;p&gt;"Review this code."&lt;/p&gt;

&lt;p&gt;But real code doesn't exist in isolation.&lt;/p&gt;

&lt;p&gt;A method might depend on another class.&lt;/p&gt;

&lt;p&gt;A variable might have a specific business meaning.&lt;/p&gt;

&lt;p&gt;A change might only make sense when you look at the entire Pull Request.&lt;/p&gt;

&lt;p&gt;So building an AI application isn't simply about calling an AI API.&lt;/p&gt;

&lt;p&gt;It's about collecting the right context and presenting it in the right way.&lt;/p&gt;

&lt;p&gt;That was one of my first major lessons.&lt;/p&gt;

&lt;p&gt;Product 2: AI Resume Analyzer&lt;/p&gt;

&lt;p&gt;The second product was an AI Resume Analyzer built with Spring Boot.&lt;/p&gt;

&lt;p&gt;The idea came from something very familiar to anyone who has applied for jobs:&lt;/p&gt;

&lt;p&gt;You spend hours creating a resume...&lt;/p&gt;

&lt;p&gt;Then send it to a company...&lt;/p&gt;

&lt;p&gt;And never know why it didn't get shortlisted.&lt;/p&gt;

&lt;p&gt;So I wanted to build a tool that could analyze a resume and provide useful feedback.&lt;/p&gt;

&lt;p&gt;The basic idea&lt;br&gt;
Resume&lt;br&gt;
  ↓&lt;br&gt;
Upload&lt;br&gt;
  ↓&lt;br&gt;
Backend processing&lt;br&gt;
  ↓&lt;br&gt;
Extract resume content&lt;br&gt;
  ↓&lt;br&gt;
AI analysis&lt;br&gt;
  ↓&lt;br&gt;
Generate feedback&lt;br&gt;
  ↓&lt;br&gt;
Return analysis&lt;/p&gt;

&lt;p&gt;The application can analyze areas such as:&lt;/p&gt;

&lt;p&gt;Skills&lt;br&gt;
Experience&lt;br&gt;
Keywords&lt;br&gt;
Resume structure&lt;br&gt;
Job relevance&lt;br&gt;
Missing information&lt;br&gt;
Potential improvements&lt;/p&gt;

&lt;p&gt;The interesting part was that this project introduced a completely different backend problem compared with the GitHub reviewer.&lt;/p&gt;

&lt;p&gt;Now the application had to deal with documents and unstructured information.&lt;/p&gt;

&lt;p&gt;What I Learned From This Project&lt;/p&gt;

&lt;p&gt;This project taught me something important:&lt;/p&gt;

&lt;p&gt;Building an AI application is often more about data preparation than the AI call itself.&lt;/p&gt;

&lt;p&gt;You can't just throw a document at an AI model and expect perfect results.&lt;/p&gt;

&lt;p&gt;The application needs to:&lt;/p&gt;

&lt;p&gt;Receive the file&lt;br&gt;
Process the content&lt;br&gt;
Extract useful information&lt;br&gt;
Organize that information&lt;br&gt;
Send the right context to the AI&lt;br&gt;
Process the response&lt;br&gt;
Present the result in a useful format&lt;/p&gt;

&lt;p&gt;The backend therefore becomes the bridge between the user's raw input and the AI model.&lt;/p&gt;

&lt;p&gt;That made me appreciate Spring Boot even more.&lt;/p&gt;

&lt;p&gt;Product 3: Self-Hosted AI Support Widget&lt;/p&gt;

&lt;p&gt;This is the project I'm currently most excited about.&lt;/p&gt;

&lt;p&gt;I built a self-hosted AI support widget using Spring Boot.&lt;/p&gt;

&lt;p&gt;The idea was to create an AI-powered support experience without forcing someone to depend on an expensive monthly SaaS subscription.&lt;/p&gt;

&lt;p&gt;The important word here is:&lt;/p&gt;

&lt;p&gt;Self-hosted.&lt;/p&gt;

&lt;p&gt;Instead of thinking:&lt;/p&gt;

&lt;p&gt;"I need to subscribe to another SaaS product."&lt;/p&gt;

&lt;p&gt;The idea becomes:&lt;/p&gt;

&lt;p&gt;"I can run this myself."&lt;/p&gt;

&lt;p&gt;The basic concept&lt;br&gt;
User&lt;br&gt;
 ↓&lt;br&gt;
Support Widget&lt;br&gt;
 ↓&lt;br&gt;
Spring Boot Backend&lt;br&gt;
 ↓&lt;br&gt;
AI Service&lt;br&gt;
 ↓&lt;br&gt;
Response&lt;br&gt;
 ↓&lt;br&gt;
Support Widget&lt;/p&gt;

&lt;p&gt;The backend handles the communication between the widget and the AI service.&lt;/p&gt;

&lt;p&gt;That means the frontend doesn't need to contain all the business logic.&lt;/p&gt;

&lt;p&gt;Spring Boot becomes the central layer responsible for the application's behavior.&lt;/p&gt;

&lt;p&gt;Why I Like This Project&lt;/p&gt;

&lt;p&gt;This project felt different from my previous applications because I wasn't just thinking about whether an API worked.&lt;/p&gt;

&lt;p&gt;I started thinking about:&lt;/p&gt;

&lt;p&gt;How would another developer use this?&lt;br&gt;
How can the application be self-hosted?&lt;br&gt;
What should the API look like?&lt;br&gt;
How should errors be handled?&lt;br&gt;
How should configuration work?&lt;br&gt;
How can the application be extended later?&lt;br&gt;
How can I make this feel like an actual product?&lt;/p&gt;

&lt;p&gt;That's when I realized something:&lt;/p&gt;

&lt;p&gt;There is a big difference between building an application and building a product.&lt;br&gt;
What These 3 Projects Taught Me&lt;/p&gt;

&lt;p&gt;After building all three, I noticed that the AI itself was not the hardest part.&lt;/p&gt;

&lt;p&gt;Calling an AI API is relatively straightforward.&lt;/p&gt;

&lt;p&gt;The difficult part is everything around it.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;AI Doesn't Replace Backend Engineering&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;This was probably my biggest takeaway.&lt;/p&gt;

&lt;p&gt;AI can generate an answer.&lt;/p&gt;

&lt;p&gt;But someone still has to build the system around it.&lt;/p&gt;

&lt;p&gt;You still need to think about:&lt;/p&gt;

&lt;p&gt;Authentication&lt;br&gt;
      ↓&lt;br&gt;
API Design&lt;br&gt;
      ↓&lt;br&gt;
Validation&lt;br&gt;
      ↓&lt;br&gt;
Business Logic&lt;br&gt;
      ↓&lt;br&gt;
Database&lt;br&gt;
      ↓&lt;br&gt;
External Services&lt;br&gt;
      ↓&lt;br&gt;
AI Integration&lt;br&gt;
      ↓&lt;br&gt;
Error Handling&lt;br&gt;
      ↓&lt;br&gt;
Deployment&lt;/p&gt;

&lt;p&gt;That's backend engineering.&lt;/p&gt;

&lt;p&gt;And AI becomes another service that the backend integrates with.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Prompt Engineering Is Only One Piece&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Before building these projects, I thought a lot about prompts.&lt;/p&gt;

&lt;p&gt;After building them, I realized that prompt engineering is only one part of the problem.&lt;/p&gt;

&lt;p&gt;A better mental model is:&lt;/p&gt;

&lt;p&gt;Good Input&lt;br&gt;
    +&lt;br&gt;
Good Context&lt;br&gt;
    +&lt;br&gt;
Good Prompt&lt;br&gt;
    +&lt;br&gt;
Good Backend Logic&lt;br&gt;
    =&lt;br&gt;
Better AI Application&lt;/p&gt;

&lt;p&gt;If the application sends poor or incomplete context, even a great model can produce a poor result.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Product Thinking Matters&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;When you're following a tutorial, the goal is usually:&lt;/p&gt;

&lt;p&gt;Make the application work.&lt;/p&gt;

&lt;p&gt;When you're building your own product, the questions change.&lt;/p&gt;

&lt;p&gt;You start asking:&lt;/p&gt;

&lt;p&gt;Who is going to use this?&lt;br&gt;
What problem does it solve?&lt;br&gt;
Why would someone use this instead of another tool?&lt;br&gt;
What happens when something fails?&lt;br&gt;
How can I make it easier to use?&lt;br&gt;
What features should I add later?&lt;/p&gt;

&lt;p&gt;Those questions changed the way I approach development.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Don't Build Features Just Because You Can&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;One of the easiest mistakes when building side projects is adding too many features.&lt;/p&gt;

&lt;p&gt;You start with:&lt;/p&gt;

&lt;p&gt;"I'll build an AI code reviewer."&lt;/p&gt;

&lt;p&gt;Then suddenly you're planning:&lt;/p&gt;

&lt;p&gt;Authentication&lt;br&gt;
Teams&lt;br&gt;
Billing&lt;br&gt;
Analytics&lt;br&gt;
Notifications&lt;br&gt;
Dashboards&lt;br&gt;
Admin panels&lt;br&gt;
Multiple AI providers&lt;br&gt;
Ten different integrations&lt;/p&gt;

&lt;p&gt;And the original product never gets finished.&lt;/p&gt;

&lt;p&gt;I've learned to ask:&lt;/p&gt;

&lt;p&gt;Does this feature solve the core problem?&lt;/p&gt;

&lt;p&gt;If the answer is no, it can wait.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A Working Product Is More Valuable Than a Huge Project&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I would rather have:&lt;/p&gt;

&lt;p&gt;3 small working products&lt;/p&gt;

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

&lt;p&gt;1 huge unfinished application.&lt;/p&gt;

&lt;p&gt;These projects also taught me that a project doesn't need 50 features to demonstrate engineering ability.&lt;/p&gt;

&lt;p&gt;A relatively small application can demonstrate:&lt;/p&gt;

&lt;p&gt;API design&lt;br&gt;
Backend architecture&lt;br&gt;
External integrations&lt;br&gt;
AI integration&lt;br&gt;
File processing&lt;br&gt;
Error handling&lt;br&gt;
Business logic&lt;br&gt;
Deployment&lt;br&gt;
Product thinking&lt;/p&gt;

&lt;p&gt;That's already a lot.&lt;/p&gt;

&lt;p&gt;The Tech Stack&lt;/p&gt;

&lt;p&gt;Across these projects, my focus was primarily on the backend ecosystem I'm comfortable with.&lt;/p&gt;

&lt;p&gt;Backend&lt;br&gt;
Java&lt;br&gt;
Spring Boot&lt;br&gt;
REST APIs&lt;br&gt;
Spring-based backend architecture&lt;br&gt;
AI&lt;br&gt;
AI APIs / LLM integration&lt;br&gt;
Prompt design&lt;br&gt;
Context preparation&lt;br&gt;
AI-generated responses&lt;br&gt;
Integrations&lt;br&gt;
GitHub APIs&lt;br&gt;
File/document processing&lt;br&gt;
External services&lt;br&gt;
Development&lt;br&gt;
Maven&lt;br&gt;
Git/GitHub&lt;br&gt;
API testing&lt;br&gt;
Logging&lt;br&gt;
Configuration management&lt;/p&gt;

&lt;p&gt;The exact implementation differs between the projects, but the common idea is the same:&lt;/p&gt;

&lt;p&gt;Use Spring Boot as the application layer that connects users, business logic, external services, and AI.&lt;/p&gt;

&lt;p&gt;What I Would Do Differently Next Time&lt;/p&gt;

&lt;p&gt;If I started these projects again, I would spend more time on architecture before writing the first line of code.&lt;/p&gt;

&lt;p&gt;I'd ask:&lt;/p&gt;

&lt;p&gt;What is the core problem?&lt;br&gt;
        ↓&lt;br&gt;
What is the minimum useful product?&lt;br&gt;
        ↓&lt;br&gt;
What APIs do I need?&lt;br&gt;
        ↓&lt;br&gt;
What data do I need?&lt;br&gt;
        ↓&lt;br&gt;
Where does AI actually add value?&lt;br&gt;
        ↓&lt;br&gt;
How should the components communicate?&lt;br&gt;
        ↓&lt;br&gt;
How will I deploy it?&lt;/p&gt;

&lt;p&gt;This prevents a project from turning into a collection of random features.&lt;/p&gt;

&lt;p&gt;What's Next?&lt;/p&gt;

&lt;p&gt;I'm not planning to stop at these three.&lt;/p&gt;

&lt;p&gt;The next step is to take what I learned from these projects and build more practical backend tools around Java, Spring Boot, AI, and databases.&lt;/p&gt;

&lt;p&gt;I'm particularly interested in projects that solve problems developers actually face.&lt;/p&gt;

&lt;p&gt;Because my goal isn't simply:&lt;/p&gt;

&lt;p&gt;"Build another AI project."&lt;/p&gt;

&lt;p&gt;My goal is:&lt;/p&gt;

&lt;p&gt;Build useful software and learn the engineering behind it.&lt;/p&gt;

&lt;p&gt;Final Takeaway&lt;/p&gt;

&lt;p&gt;Building these three products changed the way I look at AI development.&lt;/p&gt;

&lt;p&gt;I started with:&lt;/p&gt;

&lt;p&gt;"How do I integrate AI into a Spring Boot application?"&lt;/p&gt;

&lt;p&gt;And ended up thinking much more about:&lt;/p&gt;

&lt;p&gt;"How do I build a useful product where AI is actually part of the solution?"&lt;/p&gt;

&lt;p&gt;That's a much more interesting question.&lt;/p&gt;

&lt;p&gt;The AI model is only one component.&lt;/p&gt;

&lt;p&gt;The real engineering challenge is everything around it.&lt;/p&gt;

&lt;p&gt;And that's exactly the part I want to keep exploring.&lt;/p&gt;

&lt;p&gt;The 3 Products&lt;/p&gt;

&lt;p&gt;🤖 AI Code Reviewer for GitHub Pull Requests&lt;br&gt;
Analyze Pull Request changes and generate AI-powered code review feedback.&lt;/p&gt;

&lt;p&gt;📄 AI Resume Analyzer&lt;br&gt;
Analyze resumes and provide AI-powered feedback and improvement suggestions.&lt;/p&gt;

&lt;p&gt;💬 Self-Hosted AI Support Widget&lt;br&gt;
Build an AI-powered support experience that can be self-hosted without relying entirely on a monthly SaaS platform.&lt;/p&gt;

&lt;p&gt;If you're also a Java/Spring Boot developer experimenting with AI, I'd love to hear what you're building.&lt;/p&gt;

&lt;p&gt;What would you build with Spring Boot + AI?&lt;/p&gt;

&lt;p&gt;Drop it in the comments 👇&lt;/p&gt;

&lt;p&gt;🔗 Projects&lt;/p&gt;

&lt;p&gt;GitHub: [&lt;a href="https://github.com/Sweety717/" rel="noopener noreferrer"&gt;https://github.com/Sweety717/&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Project 1 — AI Code Reviewer: [&lt;a href="https://swarnalata25.gumroad.com/l/codeguard-ai" rel="noopener noreferrer"&gt;https://swarnalata25.gumroad.com/l/codeguard-ai&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Project 2 — AI Resume Analyzer: [&lt;a href="https://swarnalata25.gumroad.com/l/resumeiq-ai" rel="noopener noreferrer"&gt;https://swarnalata25.gumroad.com/l/resumeiq-ai&lt;/a&gt;]&lt;/p&gt;

&lt;p&gt;Project 3 — Self-Hosted AI Support Widget: [&lt;a href="https://swarnalata25.gumroad.com/l/supportai-springboot" rel="noopener noreferrer"&gt;https://swarnalata25.gumroad.com/l/supportai-springboot&lt;/a&gt;]&lt;/p&gt;

</description>
      <category>ai</category>
      <category>java</category>
      <category>springboot</category>
      <category>backend</category>
    </item>
    <item>
      <title>I Built My Own AI Code Reviewer for GitHub Pull Requests</title>
      <dc:creator>Swarna</dc:creator>
      <pubDate>Tue, 11 Aug 2026 10:33:47 +0000</pubDate>
      <link>https://dev.to/sweety717/i-built-my-own-ai-code-reviewer-for-github-pull-requests-4icc</link>
      <guid>https://dev.to/sweety717/i-built-my-own-ai-code-reviewer-for-github-pull-requests-4icc</guid>
      <description>&lt;p&gt;&lt;strong&gt;# I Built My Own AI Code Reviewer for GitHub Pull Requests&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Code reviews are important.&lt;/p&gt;

&lt;p&gt;But let's be honest — they can also become repetitive.&lt;/p&gt;

&lt;p&gt;Someone opens a pull request.&lt;/p&gt;

&lt;p&gt;A reviewer has to go through dozens of changed files.&lt;/p&gt;

&lt;p&gt;Then comes the usual checklist:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is there an obvious bug?&lt;/li&gt;
&lt;li&gt;Is there a security issue?&lt;/li&gt;
&lt;li&gt;Is this database query going to cause a performance problem?&lt;/li&gt;
&lt;li&gt;Is there duplicated or unnecessary code?&lt;/li&gt;
&lt;li&gt;Is there a better way to implement this?&lt;/li&gt;
&lt;li&gt;Did we introduce something that will break later?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And when the PR is large, reviewing everything carefully becomes difficult.&lt;/p&gt;

&lt;p&gt;So I decided to build something for this problem.&lt;/p&gt;

&lt;p&gt;Meet &lt;strong&gt;CodeGuard AI&lt;/strong&gt; — a self-hosted AI code reviewer for GitHub Pull Requests.&lt;/p&gt;

&lt;p&gt;The idea is simple:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Give it a GitHub PR → let AI inspect the diff → get a structured code review directly on GitHub.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;And because I wanted this to be a developer-owned tool, it is designed to run on your own infrastructure and use your own AI provider.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## What is CodeGuard AI?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CodeGuard AI is a Spring Boot application that automatically reviews GitHub Pull Requests using an AI model.&lt;/p&gt;

&lt;p&gt;It can analyze a PR for things like:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;🐛 Bugs&lt;/li&gt;
&lt;li&gt;🔐 Security issues&lt;/li&gt;
&lt;li&gt;⚡ Performance problems&lt;/li&gt;
&lt;li&gt;📐 Best-practice violations&lt;/li&gt;
&lt;li&gt;🗄️ Database-related issues&lt;/li&gt;
&lt;li&gt;💡 Improvement suggestions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Instead of returning a huge block of AI-generated text, the review is structured around findings.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;CRITICAL&lt;br&gt;
SecurityConfig.java&lt;/p&gt;

&lt;p&gt;Disabled CSRF on Session-Cookie Authentication&lt;/p&gt;

&lt;p&gt;CSRF protection is disabled while the application&lt;br&gt;
uses session cookies for authentication.&lt;/p&gt;

&lt;p&gt;Suggested fix:&lt;br&gt;
Enable CSRF protection using a CookieCsrfTokenRepository&lt;br&gt;
or switch to stateless header-based authentication.&lt;br&gt;
The goal isn't to replace human reviewers.&lt;/p&gt;

&lt;p&gt;The goal is to give them a useful first pass before they spend time going through the PR themselves.&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%2F9ktqkdqs4myctq4jucy0.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%2F9ktqkdqs4myctq4jucy0.png" alt=" " width="800" height="412"&gt;&lt;/a&gt;&lt;br&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%2F2yoki18lc3nqsbwfnb6u.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%2F2yoki18lc3nqsbwfnb6u.png" alt=" " width="800" height="380"&gt;&lt;/a&gt;&lt;br&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%2F7keg6b6ktawlpyx4a32l.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%2F7keg6b6ktawlpyx4a32l.png" alt=" " width="800" height="387"&gt;&lt;/a&gt;&lt;br&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%2Ffsbdapfhaquou8auy9ow.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%2Ffsbdapfhaquou8auy9ow.png" alt=" " width="799" height="408"&gt;&lt;/a&gt;&lt;br&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%2F4326m5ar928qptid2n4k.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%2F4326m5ar928qptid2n4k.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I built it&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;There are already many AI coding tools.&lt;/p&gt;

&lt;p&gt;AI can write code.&lt;/p&gt;

&lt;p&gt;AI can explain code.&lt;/p&gt;

&lt;p&gt;AI can generate tests.&lt;/p&gt;

&lt;p&gt;So I was interested in a slightly different question:&lt;/p&gt;

&lt;p&gt;What happens if AI becomes the first reviewer instead of the programmer?&lt;/p&gt;

&lt;p&gt;A pull request already contains something extremely valuable for an AI model:&lt;br&gt;
the change itself.&lt;/p&gt;

&lt;p&gt;You don't necessarily need to understand the entire application to start finding potential problems.&lt;/p&gt;

&lt;p&gt;You can start with:&lt;br&gt;
PR&lt;br&gt;
 ↓&lt;br&gt;
Changed files&lt;br&gt;
 ↓&lt;br&gt;
Diff&lt;br&gt;
 ↓&lt;br&gt;
AI analysis&lt;br&gt;
 ↓&lt;br&gt;
Structured findings&lt;br&gt;
 ↓&lt;br&gt;
Developer&lt;br&gt;
That became the core idea behind CodeGuard AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How CodeGuard AI works&lt;/strong&gt;&lt;br&gt;
The architecture is intentionally simple.&lt;br&gt;
                 GitHub&lt;br&gt;
                    │&lt;br&gt;
                    │ Pull Request&lt;br&gt;
                    ▼&lt;br&gt;
          ┌─────────────────────┐&lt;br&gt;
          │ GitHub Webhook       │&lt;br&gt;
          │ Receiver             │&lt;br&gt;
          └──────────┬──────────┘&lt;br&gt;
                     │&lt;br&gt;
                     ▼&lt;br&gt;
          ┌─────────────────────┐&lt;br&gt;
          │ PR / Diff Fetcher   │&lt;br&gt;
          │ GitHub API          │&lt;br&gt;
          └──────────┬──────────┘&lt;br&gt;
                     │&lt;br&gt;
                     ▼&lt;br&gt;
          ┌─────────────────────┐&lt;br&gt;
          │ Code Review Service │&lt;br&gt;
          └──────────┬──────────┘&lt;br&gt;
                     │&lt;br&gt;
                     ▼&lt;br&gt;
        ┌─────────────────────────┐&lt;br&gt;
        │ AI Provider Abstraction │&lt;br&gt;
        └──────┬──────┬──────┬───┘&lt;br&gt;
               │      │      │&lt;br&gt;
            OpenAI  Gemini  Ollama&lt;br&gt;
               │      │      │&lt;br&gt;
               └──────┴──────┘&lt;br&gt;
                     │&lt;br&gt;
                     ▼&lt;br&gt;
          ┌─────────────────────┐&lt;br&gt;
          │ Structured Review   │&lt;br&gt;
          │ Findings            │&lt;br&gt;
          └──────────┬──────────┘&lt;br&gt;
                     │&lt;br&gt;
              ┌──────┴───────┐&lt;br&gt;
              ▼              ▼&lt;br&gt;
          Dashboard       GitHub PR&lt;/p&gt;

&lt;p&gt;The application is built with:&lt;/p&gt;

&lt;p&gt;Java 17&lt;br&gt;
Spring Boot&lt;br&gt;
Spring Security&lt;br&gt;
GitHub REST API&lt;br&gt;
REST APIs&lt;br&gt;
HTML/CSS/Vanilla JavaScript&lt;br&gt;
OpenAI / Gemini / Ollama integrations&lt;br&gt;
Maven&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 1: GitHub sends the Pull Request&lt;/strong&gt;&lt;br&gt;
CodeGuard AI exposes a GitHub webhook endpoint.&lt;br&gt;
For example:&lt;br&gt;
POST /webhook/github&lt;br&gt;
When a pull request is opened, reopened, or updated, GitHub sends an event to CodeGuard AI.&lt;br&gt;
The webhook signature is verified using HMAC-SHA256 before processing the request.&lt;br&gt;
This is important because you don't want arbitrary requests triggering your review pipeline.&lt;br&gt;
&lt;strong&gt;Step 2: Fetch the Pull Request&lt;/strong&gt;&lt;br&gt;
Once the webhook is verified, CodeGuard AI uses the GitHub API to retrieve information about the PR.&lt;/p&gt;

&lt;p&gt;This includes things such as:&lt;/p&gt;

&lt;p&gt;Repository&lt;br&gt;
Pull request number&lt;br&gt;
Author&lt;br&gt;
Changed files&lt;br&gt;
Diff&lt;br&gt;
Added lines&lt;br&gt;
Deleted lines&lt;/p&gt;

&lt;p&gt;The important part is the diff.&lt;/p&gt;

&lt;p&gt;Instead of blindly sending an entire repository to an AI model, the reviewer focuses on the code that actually changed.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 3: Send the changes to the AI&lt;/strong&gt;&lt;br&gt;
The diff is then passed to the configured AI provider with a structured review prompt.&lt;br&gt;
CodeGuard AI supports multiple providers:&lt;br&gt;
OpenAI&lt;br&gt;
Google Gemini&lt;br&gt;
Ollama&lt;/p&gt;

&lt;p&gt;The provider can be selected through configuration.&lt;br&gt;
For example&lt;br&gt;
ai.provider=openai&lt;br&gt;
or:&lt;br&gt;
ai.provider=gemini&lt;br&gt;
or:&lt;br&gt;
ai.provider=ollama&lt;br&gt;
This provider abstraction was an important design decision.&lt;br&gt;
I didn't want the entire application tightly coupled to a single AI vendor.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Step 4: Generate structured findings&lt;/strong&gt;&lt;br&gt;
The AI isn't simply asked:&lt;br&gt;
"Review this code."&lt;br&gt;
Instead, the review is structured around useful information.&lt;br&gt;
A finding contains concepts such as:&lt;br&gt;
Severity&lt;br&gt;
Category&lt;br&gt;
File&lt;br&gt;
Location&lt;br&gt;
Problem&lt;br&gt;
Suggested Fix&lt;/p&gt;

&lt;p&gt;For example:&lt;br&gt;
Severity: HIGH&lt;/p&gt;

&lt;p&gt;Category: SECURITY&lt;/p&gt;

&lt;p&gt;File:&lt;br&gt;
src/main/java/com/example/config/SecurityConfig.java&lt;br&gt;
Problem:&lt;br&gt;
CSRF protection is disabled while session cookies&lt;br&gt;
are used for authentication.&lt;br&gt;
Suggested Fix:&lt;br&gt;
Enable CSRF protection or switch to stateless&lt;br&gt;
authentication.&lt;br&gt;
This makes the result much easier to consume in a dashboard or GitHub comment.&lt;br&gt;
&lt;strong&gt;Step 5: Post the review back to GitHub&lt;/strong&gt;&lt;br&gt;
One of the things I wanted from the beginning was:&lt;br&gt;
Don't make developers open another dashboard just to read the review.&lt;br&gt;
So CodeGuard AI can post the generated review directly to the Pull Request.&lt;br&gt;
The result looks something like:&lt;br&gt;
🤖 CodeGuard AI Review&lt;/p&gt;

&lt;p&gt;✅ SAFE TO MERGE&lt;/p&gt;

&lt;p&gt;Quality score: 9/10&lt;br&gt;
Risk: Low&lt;br&gt;
Confidence: 95%&lt;/p&gt;

&lt;p&gt;No issues found.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;What's good:&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Clean implementation&lt;/li&gt;
&lt;li&gt;Backward-compatible configuration&lt;/li&gt;
&lt;li&gt;Clear separation of concerns
If problems are found, the review instead highlights them with severity and suggested fixes.
The dashboard&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;The dashboard provides a second way to run and inspect reviews.&lt;/p&gt;

&lt;p&gt;You can manually enter:&lt;/p&gt;

&lt;p&gt;owner/repository&lt;br&gt;
PR number&lt;/p&gt;

&lt;p&gt;and run a review.&lt;/p&gt;

&lt;p&gt;This is useful before setting up the webhook because you can test the entire pipeline manually:&lt;/p&gt;

&lt;p&gt;GitHub&lt;br&gt;
   ↓&lt;br&gt;
Fetch PR&lt;br&gt;
   ↓&lt;br&gt;
Analyze diff&lt;br&gt;
   ↓&lt;br&gt;
AI&lt;br&gt;
   ↓&lt;br&gt;
Generate review&lt;br&gt;
   ↓&lt;br&gt;
Post comment&lt;/p&gt;

&lt;p&gt;No webhook is required for the initial test.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Review history&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;I also wanted the application to remember previous reviews.&lt;/p&gt;

&lt;p&gt;The dashboard therefore keeps review history containing information such as:&lt;/p&gt;

&lt;p&gt;Repository&lt;br&gt;
PR number&lt;br&gt;
Review score&lt;br&gt;
Risk&lt;br&gt;
Number of findings&lt;br&gt;
Files reviewed&lt;br&gt;
Lines changed&lt;br&gt;
Review timestamp&lt;/p&gt;

&lt;p&gt;This makes it possible to see how a codebase is progressing over time.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;Review #1     6/10    3 issues&lt;br&gt;
Review #2     7/10    2 issues&lt;br&gt;
Review #3     9/10    0 issues&lt;/p&gt;

&lt;p&gt;The dashboard can also visualize review trends.&lt;/p&gt;

&lt;p&gt;One interesting feature: merge recommendation&lt;/p&gt;

&lt;p&gt;I added a simple high-level verdict to make the review easier to understand.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;┌──────────────────────────────┐&lt;br&gt;
│       ✅ SAFE TO MERGE       │&lt;br&gt;
└──────────────────────────────┘&lt;/p&gt;

&lt;p&gt;Quality Score: 9/10&lt;br&gt;
AI Confidence: 95%&lt;br&gt;
Critical Issues: 0&lt;br&gt;
Suggestions: 0&lt;/p&gt;

&lt;p&gt;Or, when the PR has serious issues:&lt;/p&gt;

&lt;p&gt;┌──────────────────────────────┐&lt;br&gt;
│       ⚠️ REVIEW REQUIRED     │&lt;br&gt;
└──────────────────────────────┘&lt;/p&gt;

&lt;p&gt;Quality Score: 6/10&lt;br&gt;
Risk: Medium&lt;br&gt;
Critical Issues: 1&lt;/p&gt;

&lt;p&gt;This isn't intended to replace a team's merge policy.&lt;/p&gt;

&lt;p&gt;It's simply a quick signal for the developer.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;&lt;strong&gt;Why self-hosted?&lt;/strong&gt;&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;This was probably the most important product decision.&lt;/p&gt;

&lt;p&gt;There are already hosted AI code-review products.&lt;/p&gt;

&lt;p&gt;So why build another one?&lt;/p&gt;

&lt;p&gt;Because some developers and teams don't want their source code going through another hosted SaaS platform.&lt;/p&gt;

&lt;p&gt;With a self-hosted architecture:&lt;/p&gt;

&lt;p&gt;Your GitHub&lt;br&gt;
     ↓&lt;br&gt;
Your CodeGuard instance&lt;br&gt;
     ↓&lt;br&gt;
Your AI provider&lt;/p&gt;

&lt;p&gt;You control the infrastructure and credentials.&lt;/p&gt;

&lt;p&gt;You can use:&lt;/p&gt;

&lt;p&gt;OpenAI&lt;br&gt;
Google Gemini&lt;br&gt;
Ollama&lt;/p&gt;

&lt;p&gt;And with Ollama, you can even run a local model.&lt;/p&gt;

&lt;p&gt;The application doesn't require a CodeGuard-managed AI subscription.&lt;/p&gt;

&lt;p&gt;Private repositories&lt;/p&gt;

&lt;p&gt;CodeGuard AI isn't limited to public repositories.&lt;/p&gt;

&lt;p&gt;The GitHub Personal Access Token used by the application determines which repositories it can access.&lt;/p&gt;

&lt;p&gt;For example, a fine-grained token can be configured with the required permissions for the repositories that need to be reviewed.&lt;/p&gt;

&lt;p&gt;This makes the same architecture usable for private projects and internal repositories.&lt;/p&gt;

&lt;p&gt;Handling large Pull Requests&lt;/p&gt;

&lt;p&gt;There is an obvious problem with AI-based code review:&lt;/p&gt;

&lt;p&gt;What happens when a PR contains hundreds of files?&lt;/p&gt;

&lt;p&gt;Sending an enormous diff to an AI model isn't practical.&lt;/p&gt;

&lt;p&gt;CodeGuard AI therefore truncates large per-file diffs to keep the review within a reasonable token budget.&lt;/p&gt;

&lt;p&gt;That means extremely large PRs may receive a partial review rather than causing the entire review process to fail.&lt;/p&gt;

&lt;p&gt;This is one area I want to improve further.&lt;/p&gt;

&lt;p&gt;What I deliberately didn't build yet&lt;/p&gt;

&lt;p&gt;One thing I intentionally kept out of the first version is inline GitHub review comments.&lt;/p&gt;

&lt;p&gt;Currently, CodeGuard AI posts a structured summary comment to the Pull Request.&lt;/p&gt;

&lt;p&gt;Inline comments are more complicated because GitHub's review API requires calculating the appropriate diff positions.&lt;/p&gt;

&lt;p&gt;So a future version could potentially do this:&lt;/p&gt;

&lt;p&gt;src/main/java/UserService.java:42&lt;/p&gt;

&lt;p&gt;🔴 HIGH&lt;/p&gt;

&lt;p&gt;Potential authorization bypass.&lt;/p&gt;

&lt;p&gt;Suggested fix:&lt;br&gt;
Verify that the authenticated user owns&lt;br&gt;
the requested resource before updating it.&lt;/p&gt;

&lt;p&gt;That would make the tool much closer to a traditional human code review.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;em&gt;What I learned building it&lt;/em&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The interesting part of this project wasn't actually calling an AI API.&lt;/p&gt;

&lt;p&gt;That part is relatively straightforward.&lt;/p&gt;

&lt;p&gt;The harder part is building the system around it.&lt;/p&gt;

&lt;p&gt;A useful AI developer tool needs:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Reliable input&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The model is only as useful as the code context you provide.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Structured output&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;A giant paragraph isn't particularly useful during a code review.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Provider abstraction&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;AI providers change quickly, so coupling the application to one provider isn't ideal.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Security&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub tokens, webhook secrets and AI API keys need to be handled carefully.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Failure handling&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;GitHub API failures, AI timeouts, invalid model responses and huge diffs all need to be considered.&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;A useful UI&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Developers shouldn't have to dig through logs to understand what happened.&lt;br&gt;
**&lt;br&gt;
Current feature set**&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The current version includes:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;✅ GitHub Pull Request integration&lt;br&gt;
✅ GitHub webhook support&lt;br&gt;
✅ HMAC webhook verification&lt;br&gt;
✅ Manual PR review&lt;br&gt;
✅ AI-powered bug detection&lt;br&gt;
✅ Security analysis&lt;br&gt;
✅ Performance analysis&lt;br&gt;
✅ Best-practice analysis&lt;br&gt;
✅ Risk assessment&lt;br&gt;
✅ Quality scoring&lt;br&gt;
✅ AI confidence score&lt;br&gt;
✅ Structured findings&lt;br&gt;
✅ Suggested fixes&lt;br&gt;
✅ GitHub review comments&lt;br&gt;
✅ Review history&lt;br&gt;
✅ Review trend visualization&lt;br&gt;
✅ Markdown export&lt;br&gt;
✅ PDF export&lt;br&gt;
✅ OpenAI support&lt;br&gt;
✅ Google Gemini support&lt;br&gt;
✅ Ollama support&lt;br&gt;
✅ Light/dark mode&lt;br&gt;
✅ Self-hosted deployment&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's next?&lt;/strong&gt;&lt;br&gt;
There are several things I want to explore next.&lt;/p&gt;

&lt;p&gt;Inline review comments&lt;/p&gt;

&lt;p&gt;Instead of one summary comment, report findings directly on changed lines.&lt;/p&gt;

&lt;p&gt;GitHub App support&lt;/p&gt;

&lt;p&gt;The current version uses a Personal Access Token because it keeps the self-hosted setup simple.&lt;/p&gt;

&lt;p&gt;A GitHub App would be a better architecture for multi-repository and multi-organization deployments.&lt;/p&gt;

&lt;p&gt;Better repository configuration&lt;/p&gt;

&lt;p&gt;Allow teams to define their own review rules.&lt;/p&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;p&gt;security:&lt;br&gt;
  enabled: true&lt;/p&gt;

&lt;p&gt;performance:&lt;br&gt;
  enabled: true&lt;/p&gt;

&lt;p&gt;tests:&lt;br&gt;
  required: true&lt;/p&gt;

&lt;p&gt;style:&lt;br&gt;
  enabled: false&lt;br&gt;
Custom review prompts&lt;/p&gt;

&lt;p&gt;Different teams care about different things.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;A Spring Boot backend team may care heavily about:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;N+1 queries&lt;br&gt;
transaction boundaries&lt;br&gt;
authentication&lt;br&gt;
authorization&lt;br&gt;
database indexes&lt;br&gt;
API design&lt;/p&gt;

&lt;p&gt;A frontend team may care about completely different things.&lt;/p&gt;

&lt;p&gt;CI/CD integration&lt;/p&gt;

&lt;p&gt;Another direction is running CodeGuard AI directly inside CI pipelines.&lt;/p&gt;

&lt;p&gt;Final thoughts&lt;/p&gt;

&lt;p&gt;I started CodeGuard AI with a simple idea:&lt;/p&gt;

&lt;p&gt;AI shouldn't only help us write code. It can also help us question the code we just wrote.&lt;/p&gt;

&lt;p&gt;The goal isn't to replace experienced engineers.&lt;/p&gt;

&lt;p&gt;A good human reviewer can understand business context, architecture and trade-offs that an AI model may completely miss.&lt;/p&gt;

&lt;p&gt;But an AI reviewer can be a useful first layer.&lt;/p&gt;

&lt;p&gt;It can catch obvious issues.&lt;/p&gt;

&lt;p&gt;It can point out suspicious code.&lt;/p&gt;

&lt;p&gt;It can identify things worth discussing.&lt;/p&gt;

&lt;p&gt;And it can do that before the human reviewer spends 30 minutes reconstructing what changed.&lt;/p&gt;

&lt;p&gt;That's what I'm trying to build with CodeGuard AI.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Try it / explore the project&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;CodeGuard AI is built as a self-hosted Spring Boot application with the complete source code included.&lt;/p&gt;

&lt;p&gt;If you want to run your own instance, you can configure it with your own OpenAI, Gemini, or Ollama setup.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;&lt;/strong&gt;&lt;/p&gt;&lt;div class="crayons-card c-embed text-styles text-styles--secondary"&gt;&lt;strong&gt;
    &lt;div class="c-embed__content"&gt;
        &lt;div class="c-embed__cover"&gt;
          &lt;a href="https://swarnalata25.gumroad.com/l/codeguard-ai" class="c-link align-middle" rel="noopener noreferrer"&gt;
            &lt;img alt="" src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fpublic-files.gumroad.com%2Fxx9gwek95wrye7pw6g799oq554in" height="517" class="m-0" width="1005"&gt;
          &lt;/a&gt;
        &lt;/div&gt;
      &lt;div class="c-embed__body"&gt;
        &lt;h2 class="fs-xl lh-tight"&gt;
          &lt;a href="https://swarnalata25.gumroad.com/l/codeguard-ai" rel="noopener noreferrer" class="c-link"&gt;
            CodeGuard AI — Self-Hosted GitHub AI Code Reviewer
          &lt;/a&gt;
        &lt;/h2&gt;
          &lt;p class="truncate-at-3"&gt;
            # CodeGuard AI### Self-hosted AI code review for GitHub Pull Requests — built with Spring Boot.CodeGuard AI automatically reviews your GitHub Pull Requests using AI and identifies potential bugs, security issues, performance problems, and best-practice violations.Instead of paying for another monthly SaaS subscription, run CodeGuard AI on your own infrastructure using your own AI provider credentials.## 🚀 What You Get- 🤖 AI-powered GitHub Pull Request reviews- 🐛 Bug and logic issue detection- 🔐 Security issue detection- ⚡ Performance analysis- ✅ Best-practice checks- 📊 Quality score and risk assessment- 🎯 AI confidence score- 💬 Automatic review comments posted directly to GitHub- 🔄 Automatic reviews through GitHub webhooks- 📝 Manual PR review from the dashboard- 📚 Review history- 📈 Review trend tracking- 📄 Export reviews to Markdown and PDF- 🌙 Light and dark mode- 🔌 Multiple AI providers## 🔌 Supported AI ProvidersChoose the provider that works best for you:- OpenAI- Google Gemini- Ollama (local AI)Your AI provider can be changed through configuration without changing the core review architecture.## 🛠️ Technology Stack- Java 17+- Spring Boot- Spring Security- GitHub REST API- AI provider integrations- REST APIs- HTML / CSS / Vanilla JavaScript- Maven## 🔐 Self-Hosted &amp;amp;amp; PrivateCodeGuard AI is designed to run in your own environment.Your GitHub credentials and AI API keys stay under your control.It can be used with repositories your GitHub token has permission to access, including private repositories when the token has the required permissions.## 📦 What's IncludedThe download includes:- Complete Spring Boot source code- Installation Guide- User Manual- API Documentation- Architecture Diagram- Database Schema- SQL database script- Postman Collection- Environment Configuration Guide- Sample Repository Guide- Changelog- License## ⚡ How It WorksGitHub Pull Request↓GitHub Webhook↓CodeGuard AI↓Fetch PR Changes↓AI Analysis↓Security / Bug / Performance Review↓Quality &amp;amp;amp; Risk Assessment↓GitHub Review Comment## 🎯 Who Is This For?CodeGuard AI is ideal for:- Java / Spring Boot developers- Backend developers- Solo developers- Small development teams- Freelancers- Developers building internal developer tools- Anyone who wants an AI-assisted code review system they can run themselves## 💡 Why Buy the Source Code?This isn't just a demo UI.You get the complete backend implementation and supporting documentation so you can:- Run it locally- Deploy it on your own server- Customize the review logic- Change the AI provider- Modify the dashboard- Extend the GitHub integration- Build additional features on top of it## ⚠️ Requirements- Java 17+- Maven 3.8+- GitHub Personal Access Token- OpenAI, Gemini, or Ollama- A GitHub repository/PR accessible by your configured tokenDetailed setup instructions are included in the download.---### Build on top of it. Customize it. Self-host it.One-time purchase. No CodeGuard AI subscription required.
          &lt;/p&gt;
&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;    &amp;lt;div class="color-secondary fs-s flex items-center"&amp;gt;
        &amp;lt;img
          alt="favicon"
          class="c-embed__favicon m-0 mr-2 radius-0"
          src="https://public-files.gumroad.com/v56byb8cpoecdju06otk8bb7y66g"
          loading="lazy" /&amp;gt;
      swarnalata25.gumroad.com
    &amp;lt;/div&amp;gt;
  &amp;lt;/div&amp;gt;
&amp;lt;/div&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;

&lt;/div&gt;
&lt;br&gt;


&lt;p&gt;I'd especially love feedback on:&lt;/p&gt;

&lt;p&gt;What should an AI code reviewer detect?&lt;br&gt;
Would you use a self-hosted reviewer?&lt;br&gt;
Which AI provider would you prefer?&lt;br&gt;
Are inline GitHub comments more useful than a single summary?&lt;br&gt;
What would make this useful for your team?&lt;/p&gt;

&lt;p&gt;Thanks for reading! 🚀&lt;/p&gt;
&lt;/div&gt;
&lt;/strong&gt;&lt;/div&gt;&lt;p&gt;&lt;/p&gt;

</description>
      <category>ai</category>
      <category>java</category>
      <category>springboot</category>
      <category>github</category>
    </item>
    <item>
      <title>I Built an AI Resume Analyzer in Spring Boot Instead of Another CRUD Project</title>
      <dc:creator>Swarna</dc:creator>
      <pubDate>Sat, 08 Aug 2026 05:17:44 +0000</pubDate>
      <link>https://dev.to/sweety717/i-built-an-ai-resume-analyzer-in-spring-boot-instead-of-another-crud-project-237o</link>
      <guid>https://dev.to/sweety717/i-built-an-ai-resume-analyzer-in-spring-boot-instead-of-another-crud-project-237o</guid>
      <description>&lt;h1&gt;
  
  
  I Built an AI Resume Analyzer in Spring Boot Instead of Another CRUD Project
&lt;/h1&gt;

&lt;p&gt;After finishing my previous AI Support Widget project, I wanted to build something that solved a different real-world problem.&lt;/p&gt;

&lt;p&gt;Most developers have built a Todo app, an Employee Management System, or another CRUD project.&lt;/p&gt;

&lt;p&gt;I wanted to build something people could actually use.&lt;/p&gt;

&lt;p&gt;So I spent the last few weeks building an AI-powered Resume Analyzer using Spring Boot.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## The idea&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Whenever I apply for jobs, I usually wonder:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Is my resume ATS friendly?&lt;/li&gt;
&lt;li&gt;Which keywords am I missing?&lt;/li&gt;
&lt;li&gt;Which resume version is better?&lt;/li&gt;
&lt;li&gt;How can I improve my chances before applying?&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There are plenty of online tools, but I wanted a self-hosted application that I fully controlled.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## Tech Stack&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java 17&lt;/li&gt;
&lt;li&gt;Spring Boot 3&lt;/li&gt;
&lt;li&gt;Spring Security&lt;/li&gt;
&lt;li&gt;Spring Data JPA&lt;/li&gt;
&lt;li&gt;Thymeleaf&lt;/li&gt;
&lt;li&gt;MySQL&lt;/li&gt;
&lt;li&gt;OpenAI API&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&lt;strong&gt;## What it does&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of simply uploading a resume and getting one score, the application provides multiple AI-powered features.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### ATS Resume Analysis&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The application analyzes a resume against a job description and generates:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;ATS score&lt;/li&gt;
&lt;li&gt;Resume strengths&lt;/li&gt;
&lt;li&gt;Weaknesses&lt;/li&gt;
&lt;li&gt;Missing keywords&lt;/li&gt;
&lt;li&gt;Resume improvement suggestions&lt;/li&gt;
&lt;/ul&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%2Fm8ll13nnpbsjqi02blgs.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%2Fm8ll13nnpbsjqi02blgs.png" alt=" " width="800" height="422"&gt;&lt;/a&gt;&lt;br&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%2Fqkjjshculop4lma7jj08.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%2Fqkjjshculop4lma7jj08.png" alt=" " width="799" height="399"&gt;&lt;/a&gt;&lt;br&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%2Feyensdilz88f2j8627gy.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%2Feyensdilz88f2j8627gy.png" alt=" " width="800" height="461"&gt;&lt;/a&gt;&lt;br&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%2F76z03r8wh4p2rbd51muh.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%2F76z03r8wh4p2rbd51muh.png" alt=" " width="800" height="431"&gt;&lt;/a&gt;&lt;br&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%2Fadasn5d70u4d4owinq6h.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%2Fadasn5d70u4d4owinq6h.png" alt=" " width="799" height="422"&gt;&lt;/a&gt;&lt;br&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%2Fj6gg6c5ge5shxl253jhh.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%2Fj6gg6c5ge5shxl253jhh.png" alt=" " width="800" height="420"&gt;&lt;/a&gt;&lt;br&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%2Fclyim56emlg1ptc5afky.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%2Fclyim56emlg1ptc5afky.png" alt=" " width="800" height="415"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### AI Resume Rewrite&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of manually editing bullet points, the application rewrites the resume while preserving the candidate's actual experience.&lt;/p&gt;

&lt;p&gt;The goal isn't to invent achievements.&lt;/p&gt;

&lt;p&gt;It's to improve clarity and ATS readability.&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%2F2jnvz239hq0asyc4oba9.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%2F2jnvz239hq0asyc4oba9.png" alt=" " width="800" height="458"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### Resume Comparison&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One feature I personally found useful was comparing two versions of the same resume.&lt;/p&gt;

&lt;p&gt;Sometimes changing only a few bullet points increased the ATS score significantly.&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%2Fmesv1u8weiyzbhxvxnm1.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%2Fmesv1u8weiyzbhxvxnm1.png" alt=" " width="799" height="434"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### Resume Versioning&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Rather than replacing previous analyses, every analysis is saved.&lt;/p&gt;

&lt;p&gt;This allows users to compare improvements over time.&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%2F8i1uciej4d3eol4fgu8q.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%2F8i1uciej4d3eol4fgu8q.png" alt=" " width="800" height="461"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### AI Interview Preparation&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;After analyzing the resume, the application can generate interview questions based on:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Resume&lt;/li&gt;
&lt;li&gt;Skills&lt;/li&gt;
&lt;li&gt;Experience&lt;/li&gt;
&lt;li&gt;Job Description&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;This makes the tool useful even after the ATS analysis is complete.&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%2F4mpq6f5n1ox27v7xrrlr.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%2F4mpq6f5n1ox27v7xrrlr.png" alt=" " width="800" height="450"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### Dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The application also includes a dashboard showing:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Previous analyses&lt;/li&gt;
&lt;li&gt;Average ATS score&lt;/li&gt;
&lt;li&gt;Highest score&lt;/li&gt;
&lt;li&gt;Resume history&lt;/li&gt;
&lt;li&gt;Trends over time&lt;/li&gt;
&lt;/ul&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%2Fz46o4k64qs0r8eny7bi8.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%2Fz46o4k64qs0r8eny7bi8.png" alt=" " width="800" height="492"&gt;&lt;/a&gt;&lt;br&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%2F41a035o2g8lwack6n89m.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%2F41a035o2g8lwack6n89m.png" alt=" " width="799" height="471"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## Challenges&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One interesting challenge was balancing AI output with predictable scoring.&lt;/p&gt;

&lt;p&gt;Large Language Models are creative, but ATS scoring should feel consistent.&lt;/p&gt;

&lt;p&gt;I ended up combining deterministic scoring with AI-generated explanations so that users receive both a measurable score and useful feedback.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## What I intentionally didn't build&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One thing I deliberately left out was payment gateway integration.&lt;/p&gt;

&lt;p&gt;The application already supports usage limits and user plans, but checkout integration (Stripe/Razorpay) is something I'd rather let developers integrate based on their own business needs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## Lessons Learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building AI products isn't just about calling an LLM.&lt;/p&gt;

&lt;p&gt;Most of the work is actually:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Prompt engineering&lt;/li&gt;
&lt;li&gt;Designing good workflows&lt;/li&gt;
&lt;li&gt;Managing user data&lt;/li&gt;
&lt;li&gt;Producing useful outputs&lt;/li&gt;
&lt;li&gt;Creating a smooth user experience&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Those parts took far longer than integrating the OpenAI API itself.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;## Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This project taught me much more than another CRUD application ever could.&lt;/p&gt;

&lt;p&gt;I'm now building a collection of AI-powered Spring Boot applications focused on solving real business problems instead of tutorial-style examples.&lt;/p&gt;

&lt;p&gt;If you're building AI products with Java or Spring Boot, I'd love to hear what you're working on.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;### Source Code&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I packaged this project as a complete Spring Boot source code product with documentation, database scripts, API collection, installation guide, and production-ready architecture.&lt;/p&gt;

&lt;p&gt;If you'd like to build on top of it instead of starting from scratch, you can check it out here:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://swarnalata25.gumroad.com/l/resumeiq-ai" rel="noopener noreferrer"&gt;https://swarnalata25.gumroad.com/l/resumeiq-ai&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'd also love your feedback on what features you'd add next.&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>java</category>
      <category>ai</category>
      <category>webdev</category>
    </item>
    <item>
      <title>I Built a Self-Hosted AI Support Widget with Spring Boot (No Monthly SaaS Fees)</title>
      <dc:creator>Swarna</dc:creator>
      <pubDate>Fri, 07 Aug 2026 15:19:16 +0000</pubDate>
      <link>https://dev.to/sweety717/i-built-a-self-hosted-ai-support-widget-with-spring-boot-no-monthly-saas-fees-53m2</link>
      <guid>https://dev.to/sweety717/i-built-a-self-hosted-ai-support-widget-with-spring-boot-no-monthly-saas-fees-53m2</guid>
      <description>&lt;p&gt;Every new SaaS seems to embed ChatGPT these days.&lt;/p&gt;

&lt;p&gt;Most AI support solutions rely on third-party platforms, monthly subscriptions, and vendor lock-in. While they're great products, I wanted something different.&lt;/p&gt;

&lt;p&gt;I wanted complete ownership.&lt;/p&gt;

&lt;p&gt;I wanted to deploy everything on my own server, use my own OpenAI API key, customize every part of the experience, and embed the widget into any website with a single script tag.&lt;/p&gt;

&lt;p&gt;So I built my own self-hosted AI support widget using Spring Boot and Vanilla JavaScript.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I Built It&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;When building small products and websites, I realized that customer support quickly becomes a problem.&lt;/p&gt;

&lt;p&gt;Users have questions about pricing, features, returns, or simply get stuck.&lt;/p&gt;

&lt;p&gt;Most developers solve this by integrating services like Intercom, Crisp, or Tidio.&lt;/p&gt;

&lt;p&gt;Those platforms are excellent, but they also mean:&lt;/p&gt;

&lt;p&gt;Monthly subscription costs&lt;br&gt;
Vendor lock-in&lt;br&gt;
Customer conversations stored on third-party platforms&lt;br&gt;
Limited customization&lt;br&gt;
Another external dependency&lt;/p&gt;

&lt;p&gt;I wanted something that developers could completely own.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Goal&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The goal was simple.&lt;/p&gt;

&lt;p&gt;Build an AI-powered customer support widget that developers can deploy on their own server and integrate into any website in less than a minute.&lt;/p&gt;

&lt;p&gt;The widget should:&lt;/p&gt;

&lt;p&gt;Answer customer questions using AI&lt;br&gt;
Learn from a custom knowledge base&lt;br&gt;
Match the company's branding&lt;br&gt;
Store conversation history&lt;br&gt;
Allow human handoff&lt;br&gt;
Be easy to deploy&lt;br&gt;
Require only one script tag to embed&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Technology Stack&lt;/strong&gt;&lt;br&gt;
Java 17&lt;br&gt;
Spring Boot 3&lt;br&gt;
Spring Security&lt;br&gt;
Spring Data JPA&lt;br&gt;
Thymeleaf&lt;br&gt;
Vanilla JavaScript&lt;br&gt;
H2 Database (MySQL supported)&lt;br&gt;
OpenAI API&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The overall architecture is intentionally simple.&lt;br&gt;
Visitor&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
AI Chat Widget&lt;br&gt;
(Vanilla JavaScript)&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
Spring Boot REST API&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
OpenAI API&lt;br&gt;
      │&lt;br&gt;
      ▼&lt;br&gt;
Database&lt;br&gt;
(H2 / MySQL)&lt;br&gt;
Keeping the frontend framework-free makes the widget lightweight and easy to embed into virtually any website.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;One-Line Integration&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Adding the widget to a website only requires a single script.&lt;br&gt;
&lt;code&gt;&amp;lt;script src="/widget/widget.js" data-api-base=""&amp;gt;&amp;lt;/script&amp;gt;&lt;/code&gt;&lt;br&gt;
No React.&lt;/p&gt;

&lt;p&gt;No Vue.&lt;/p&gt;

&lt;p&gt;No npm packages.&lt;/p&gt;

&lt;p&gt;Just one script.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Features I Built&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The project includes:&lt;/p&gt;

&lt;p&gt;✅ AI-powered customer support&lt;/p&gt;

&lt;p&gt;✅ Spring Boot backend&lt;/p&gt;

&lt;p&gt;✅ Secure admin authentication&lt;/p&gt;

&lt;p&gt;✅ Custom knowledge base&lt;/p&gt;

&lt;p&gt;✅ Conversation history&lt;/p&gt;

&lt;p&gt;✅ Brand customization&lt;/p&gt;

&lt;p&gt;✅ Human handoff with email notification&lt;/p&gt;

&lt;p&gt;✅ OpenAI API configuration&lt;/p&gt;

&lt;p&gt;✅ H2 support with MySQL production configuration&lt;/p&gt;

&lt;p&gt;✅ One-line website integration&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Admin Dashboard&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of hardcoding prompts inside the application, administrators can configure everything from the dashboard.&lt;/p&gt;

&lt;p&gt;They can update:&lt;/p&gt;

&lt;p&gt;Company name&lt;br&gt;
Greeting message&lt;br&gt;
Brand color&lt;br&gt;
OpenAI API key&lt;br&gt;
Knowledge base&lt;br&gt;
Notification email&lt;/p&gt;

&lt;p&gt;Changes take effect immediately without restarting the application.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why I Didn't Use RAG&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;One interesting design decision was intentionally not implementing Retrieval-Augmented Generation (RAG).&lt;/p&gt;

&lt;p&gt;Instead, administrators maintain a simple knowledge base that is included in the AI's system prompt.&lt;/p&gt;

&lt;p&gt;For small and medium-sized businesses, this approach keeps deployment extremely simple while still delivering accurate responses.&lt;/p&gt;

&lt;p&gt;If the project grows, adding vector search later is straightforward.&lt;/p&gt;

&lt;p&gt;Sometimes simplicity is the better engineering decision.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Human Handoff&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI can't answer everything.&lt;/p&gt;

&lt;p&gt;Whenever visitors need human assistance, they can submit their email.&lt;/p&gt;

&lt;p&gt;The system:&lt;/p&gt;

&lt;p&gt;Stores the lead in the database&lt;br&gt;
Sends an email notification (if SMTP is configured)&lt;br&gt;
Lets administrators continue the conversation manually&lt;/p&gt;

&lt;p&gt;This ensures users never hit a dead end.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Lessons Learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Building the OpenAI integration wasn't actually the hardest part.&lt;/p&gt;

&lt;p&gt;The real engineering challenges were:&lt;/p&gt;

&lt;p&gt;Designing a flexible architecture&lt;br&gt;
Authentication and authorization&lt;br&gt;
Conversation persistence&lt;br&gt;
Prompt management&lt;br&gt;
Making the widget framework-independent&lt;br&gt;
Creating an admin experience that non-developers can use&lt;/p&gt;

&lt;p&gt;Those pieces ended up being much more interesting than simply calling an AI API.&lt;/p&gt;

&lt;p&gt;Things I Intentionally Left Out&lt;/p&gt;

&lt;p&gt;Every project needs boundaries.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;I intentionally skipped:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Multi-tenancy&lt;br&gt;
Stripe subscriptions&lt;br&gt;
Vector databases&lt;br&gt;
Multiple AI providers&lt;br&gt;
Complex AI orchestration&lt;/p&gt;

&lt;p&gt;The goal was to build a clean, understandable codebase that developers can deploy quickly and extend however they like.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What's Next?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I'm considering adding:&lt;/p&gt;

&lt;p&gt;Streaming AI responses&lt;br&gt;
Multiple AI providers&lt;br&gt;
RAG support&lt;br&gt;
File uploads&lt;br&gt;
Conversation analytics&lt;br&gt;
Multi-tenant architecture&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Final Thoughts&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;This project reminded me that building AI products isn't just about connecting to an LLM.&lt;/p&gt;

&lt;p&gt;The real engineering happens around it:&lt;/p&gt;

&lt;p&gt;authentication&lt;br&gt;
configuration&lt;br&gt;
deployment&lt;br&gt;
usability&lt;br&gt;
persistence&lt;br&gt;
developer experience&lt;/p&gt;

&lt;p&gt;Those are the parts that transform an API call into a real product.&lt;/p&gt;

&lt;p&gt;I'd love to hear how you're building AI applications with Java or Spring Boot, and what features you would add to a self-hosted support widget.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Interested in the Full Project?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;I built this as a complete, production-ready Spring Boot project. If you'd like the full source code, setup guide, and deployment instructions, you can find it here:&lt;/p&gt;

&lt;p&gt;👉(&lt;a href="https://swarnalata25.gumroad.com/l/supportai-springboot" rel="noopener noreferrer"&gt;https://swarnalata25.gumroad.com/l/supportai-springboot&lt;/a&gt;)&lt;/p&gt;

&lt;p&gt;I'm also building more self-hosted Java &amp;amp; Spring Boot products, so feedback and suggestions are always welcome.&lt;/p&gt;

</description>
      <category>springboot</category>
      <category>java</category>
      <category>ai</category>
      <category>opensource</category>
    </item>
  </channel>
</rss>
