# I Built a Multi-Provider AI Resume Analyzer with Spring Boot — Here's How ATS Matching Works

> Source: <https://dev.to/sweety717/i-built-a-multi-provider-ai-resume-analyzer-with-spring-boot-heres-how-ats-matching-works-3jg5>
> Published: 2026-09-29 15:36:11+00:00

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)
