I Built a Multi-Provider AI Resume Analyzer with Spring Boot — Here's How ATS Matching Works A developer built ResumeIQ AI, a Java 17 and Spring Boot 3 application that scores resumes against specific job descriptions rather than producing a generic ATS number. The system supports multiple AI providers — OpenAI, Gemini and Ollama — and returns an overall match score, ATS compatibility, matching and missing skills, keyword frequency analysis and improvement suggestions, with an example run showing an 88% match and 90% ATS compatibility. If you've ever tried building an AI-powered resume analyzer, one of the first things you discover is that: "Send the resume to an AI model and ask for an ATS score" isn't really enough. A useful resume-analysis system needs to answer several questions: How well does the resume match a specific job description? Which skills are missing? Which keywords are missing or underrepresented? How strong is the ATS compatibility? Does the candidate's experience match the role? What could be improved? Can AI help rewrite the resume? Can the system compare different resume versions? I wanted to explore these problems from a backend-engineering perspective, so I built ResumeIQ AI, a Java and Spring Boot based AI resume-analysis application. The interesting part wasn't simply connecting an application to an AI API. It was building the workflow around it. The Technology Stack The backend is built around: Java 17 Spring Boot 3 Spring Security Spring Data JPA MySQL Thymeleaf Maven OpenAI Gemini Ollama One of the design decisions I wanted to explore was multi-provider AI support, rather than coupling the application to a single AI provider. An ATS score without a target job isn't particularly meaningful. Consider a resume containing: Java Spring Boot MySQL Docker REST APIs Microservices For one position, that could be a strong match. For another position requiring: Java Spring Boot Kafka AWS Kubernetes Redis the same resume could have significant gaps. So instead of asking: "Is this a good resume?" the application asks: "How well does this resume match this particular job?" The basic workflow is: Resume + Job Description ↓ Resume Analysis ↓ Matching ↓ ATS Score ↓ Skills + Keywords + Gaps ↓ AI Suggestions ↓ Resume Improvement Here's what the analysis starts with: ResumeIQ starts with a job description and resume rather than generating a generic resume score. The user can provide a resume and the complete job description, and the application analyzes the two together. The matching process can be thought of as: Resume ↓ Extract relevant skills / experience / keywords ↓ Job Description ↓ Extract required skills / keywords ↓ Compare ↓ Generate analysis The result isn't intended to be just one number. It can contain: Overall match score ATS compatibility Matching skills Missing skills Keyword analysis Experience comparison Score breakdown Improvement suggestions Here's an example from the application: The analysis provides both an overall match score and a more detailed breakdown of the resume against the job description. The example shows an 88% match along with an ATS compatibility score of 90%. The important part is that the score is accompanied by additional information explaining what contributed to it. A single score can be difficult to interpret. For that reason, ResumeIQ breaks the analysis into different categories. For example: Technical Skills Experience Projects Education Achievements Each category contributes to the overall analysis. The score is broken into multiple categories rather than presenting only a single ATS number. This makes it easier to identify where the resume is relatively strong and where it needs improvement. One of the more useful parts of resume-to-job matching is identifying what is missing. For example, a job description might require: Java Spring Boot Hibernate PostgreSQL Microservices AWS CI/CD while the resume may clearly demonstrate some of those skills but not others. ResumeIQ separates this information into areas such as: Matching skills Missing skills Keyword frequency Keyword recommendations Importance of missing skills The application identifies missing skills and also analyzes how frequently important keywords appear in the resume. This is more actionable than simply telling someone: "Your ATS score is 78." The more useful question is: "Why is the score 78, and what can I change?" Traditional keyword matching has limitations. Suppose a resume contains: "Built backend services using Spring Boot." while a job description says: "Experience developing RESTful microservices using Spring Boot." A useful system needs to consider more than whether two strings are identical. This is where AI can become useful. The application can use AI to interpret the resume and job-description context and generate recommendations around: wording experience descriptions missing information resume structure potential improvements The goal isn't to let the LLM decide everything. Instead, the application combines structured analysis with AI-generated reasoning. After identifying potential weaknesses, the system can turn them into concrete recommendations. For example, the analysis can suggest improvements around: AWS experience resume structure duplicate skills ATS formatting experience descriptions The AI layer turns the analysis into specific suggestions instead of stopping at a score. This creates a workflow closer to: Analysis ↓ Identify weakness ↓ Explain weakness ↓ Suggest improvement rather than simply: Resume → Score → Done One of the more practical features is showing how specific resume statements could be improved. Before Developed and Maintained backend microservices and relational databases in production; reduced API response time by 30% through query optimization and service tuning. After Developed and maintained production backend microservices and relational databases using Spring Boot, reducing API response times by 30% via query optimization and database tuning. The objective isn't to invent experience. It's to make existing experience clearer and more aligned with the job requirements. The application shows concrete before-and-after examples rather than only giving general writing advice. The next step is taking those recommendations and generating a complete improved version. ResumeIQ includes an AI resume-rewriting workflow that can generate an ATS-oriented version based on the selected job description. The generated resume can then be reviewed and exported in different formats. The important design principle here is that the system should improve how existing experience is presented rather than fabricate qualifications. Resume optimization is often iterative. A candidate might have: Version 1 → 82% Version 2 → 88% Version 3 → 92% Instead of treating every analysis as completely independent, ResumeIQ includes functionality around: analysis history resume versions comparing resumes tracking score changes The application also supports comparing two resumes against the same job description. This can be useful when experimenting with different versions of the same resume. One architectural decision I wanted to explore was avoiding a hard dependency on one AI provider. ResumeIQ supports: OpenAI Gemini Ollama Conceptually: ┌── OpenAI │ Application ── AI Provider Layer ── Gemini │ └── Ollama This gives developers flexibility to experiment with different providers and deployment approaches. For example, a developer might want to use a cloud model in one environment and a locally running model through Ollama in another. For this project, Spring Boot acts as the backend foundation connecting the different parts of the application. The application needs to handle: Authentication ↓ Resume processing ↓ Job-description processing ↓ Matching ↓ AI integration ↓ Persistence ↓ Analysis results This is where the project becomes more interesting than simply calling an AI API. The backend has to coordinate multiple workflows and maintain the state of analyses, resumes and versions. The most interesting part of building an AI application isn't necessarily: "How do I call an LLM?" The harder questions are: What information should be sent to the model? How much context is enough? Which parts should be deterministic? Which parts actually benefit from an LLM? How do you avoid coupling the entire application to one provider? These questions become increasingly important as an AI application grows beyond a simple API demo. The resulting application includes functionality around: ATS-style resume analysis Job-description matching Match scoring Missing keywords Missing skills Keyword analysis Experience-gap detection Improvement suggestions AI rewriting Resume/JD comparison Resume versioning Analysis history Interview preparation Multiple AI providers Dashboard functionality The project is designed as a source-code foundation that developers can customize and extend, rather than as a hosted SaaS product. There are several areas I'd like to explore further. Better semantic matching Moving beyond basic keyword matching toward deeper semantic comparison between resume experience and job requirements. Better context selection Determining which parts of a resume and job description actually need to be sent to the model. Model evaluation Creating a consistent way to compare different models and prompts for resume-analysis tasks. More provider flexibility Making it easier to switch between cloud-based and locally hosted models. More career workflows Expanding the system beyond resume analysis into additional parts of the job-search workflow. Final Thoughts Building ResumeIQ changed how I think about AI applications. The interesting part isn't: Resume → LLM → Score It's the system around the model: Structured Analysis + Matching + AI Reasoning + Actionable Recommendations + Resume Improvement AI becomes much more useful when it is combined with application logic instead of being treated as the entire application. For me, the combination of: Java + Spring Boot + AI + document processing + matching + real-world automation is what makes this project interesting from a backend-engineering perspective. Source Code If you're building a resume platform, career SaaS, ATS tool, or experimenting with AI-powered career applications, I made the complete ResumeIQ AI source code available as a customizable Spring Boot foundation. ResumeIQ AI — AI Resume Analyzer & ATS SaaS Starter https://javacoder716.gumroad.com/l/resumeiq-ai https://javacoder716.gumroad.com/l/resumeiq-ai