An AI-Driven Resume Optimization and Generation Platform
ResumeAgent is a sophisticated backend platform that leverages multi-agent AI architecture to transform generic resumes into job-specific, ATS-optimized documents. Built with modern Java technologies and intelligent AI orchestration, it addresses the critical challenge of resume customization in today's competitive job market.
- Overview
- The Problem
- Key Features
- Architecture
- Technology Stack
- Multi-Agent Pipeline
- Data Model
- Database Schema
- Template System
- Getting Started
- API Documentation
- Project Roadmap
- Contributing
- License
ResumeAgent solves a fundamental problem in modern job applications: qualified candidates are rejected not due to lack of skills, but because their resumes fail to pass Applicant Tracking Systems (ATS).
The platform analyzes a candidate's master resume alongside a target job description, then generates a tailored, ATS-compliant resume using a sophisticated multi-agent AI pipeline. The result is a professionally formatted, editable DOCX document that maximizes the chances of passing ATS filters while maintaining factual accuracy.
- Separation of Concerns: AI generates content, templates handle layout, users control edits
- Deterministic Output: AI is never responsible for formatting; layout is controlled by templates
- Cost-Efficient AI: Small prompts, structured outputs, minimal token usage
- User Control: All outputs are editable with full transparency
- Generic Applications: Job seekers reuse the same resume for all applications
- ATS Rejection: Systems filter out qualified candidates due to missing keywords or poor formatting
- Time-Consuming: Manual customization for each job posting is impractical
- AI Limitations: Existing tools often produce verbose, unstructured, or factually incorrect content
- Loss of Control: Users can't easily edit AI-generated outputs
- ❌ Lack of job-specific tailoring → ✅ Automated, intelligent customization
- ❌ Poor ATS compatibility → ✅ Structured, keyword-optimized output
- ❌ No structured resume representation → ✅ Canonical JSON data model
- ❌ High AI costs → ✅ Efficient, model-agnostic token usage
- ❌ Limited user control → ✅ Fully editable DOCX outputs
- 📄 Job-Specific Resumes: Generate tailored resumes from a single master document
- 🎯 ATS Optimization: Ensure keyword alignment and format compatibility
- ✏️ Fully Editable: Receive professional DOCX files you can customize
- 🔒 Privacy-Aware: Your data stays secure and under your control
- 📊 Version Tracking: Maintain multiple resume versions for different roles
- 🏗️ Modular Architecture: Clean separation between AI logic and business rules
- 🔌 Model-Agnostic: Support for OpenAI, Claude, Llama, and local models via Ollama
- 💰 Cost-Efficient: Optimized prompting with minimal token consumption
- 🛠️ Extensible: Easy to add new agents, templates, or features
- 📦 Open Source Ready: MIT-licensed with comprehensive documentation
- Multi-Agent Pipeline: Specialized agents for parsing, analysis, matching, rewriting, and optimization
- Canonical Data Model: Structured JSON representation ensures consistency
- Template-Based Rendering: FreeMarker + DOCX for professional outputs
- PostgreSQL Backend: Robust data persistence with version control
- Spring Boot REST API: Modern, scalable backend architecture
ResumeAgent employs a layered, pipeline-based architecture that separates concerns and maximizes maintainability.
┌─────────────────────────────────────────────────────────────┐
│ Client Layer │
│ (Postman / Next.js Frontend) │
└─────────────────────┬───────────────────────────────────────┘
│
┌─────────────────────▼───────────────────────────────────────┐
│ Spring Boot REST API │
│ (Controllers, DTOs, Validation) │
└─────────────────────┬───────────────────────────────────────┘
│
┌─────────────────────▼───────────────────────────────────────┐
│ Resume Pipeline Service │
│ (Orchestrates Multi-Agent Workflow) │
└─────────────────────┬───────────────────────────────────────┘
│
┌─────────────────────▼───────────────────────────────────────┐
│ Multi-Agent AI Processing │
│ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Resume │ │ Job Desc │ │ Matching │ │
│ │ Parser │→ │ Analyzer │→ │ Agent │ │
│ └──────────────┘ └──────────────┘ └──────┬───────┘ │
│ │ │
│ ┌──────────────┐ ┌──────────────┐ │ │
│ │ ATS │ │ Resume │ ◀──────┘ │
│ │ Optimizer │← │ Rewriter │ │
│ └──────┬───────┘ └──────────────┘ │
└─────────┼───────────────────────────────────────────────────┘
│
┌─────────▼───────────────────────────────────────────────────┐
│ Structured Resume JSON │
│ (Canonical Data Representation) │
└─────────┬───────────────────────────────────────────────────┘
│
┌─────────▼───────────────────────────────────────────────────┐
│ Template Renderer │
│ (FreeMarker + docx4j / Apache POI) │
└─────────┬───────────────────────────────────────────────────┘
│
┌─────────▼───────────────────────────────────────────────────┐
│ Final Editable Resume (DOCX) │
└─────────────────────────────────────────────────────────────┘
- Single Responsibility: Each agent handles one specific task
- Immutable Data Flow: Agents transform data without side effects
- Template Independence: Resume JSON can render to any format
- Testability: Each layer can be tested independently
- Extensibility: New agents or templates can be added without refactoring
| Technology | Version | Purpose |
|---|---|---|
| Java | 21 (LTS) | Core language with modern concurrency features |
| Spring Boot | 3.x | REST API, dependency injection, auto-configuration |
| Spring AI | Latest | Unified AI model abstraction |
| Spring Data JPA | Latest | Data persistence layer |
| Hibernate | Latest | ORM and entity management |
| Service | Purpose |
|---|---|
| OpenRouter | Model aggregation (OpenAI, Claude, Llama, Groq) |
| Spring AI OpenAI | Direct OpenAI integration |
| Ollama | Local LLM support for offline/privacy-focused scenarios |
| Technology | Purpose |
|---|---|
| PostgreSQL | 15+ |
| Liquibase | Schema versioning and migrations |
| Flyway | Alternative migration tool (optional) |
| Technology | Purpose |
|---|---|
| FreeMarker | Template engine for dynamic content |
| docx4j | DOCX manipulation and generation |
| Apache POI | Alternative DOCX library |
| Technology | Purpose |
|---|---|
| Next.js | React-based frontend framework |
| Shadcn UI | Component library |
| TypeScript | Type-safe frontend development |
ResumeAgent uses a sequential multi-agent architecture where each agent performs a specialized task. This design ensures accuracy, maintainability, and debuggability.
Master Resume + Job Description
↓
┌─────────────────────┐
│ Resume Parser │ → Extracts structured data from resume
└─────────┬───────────┘
↓
┌─────────────────────┐
│ Job Description │ → Analyzes job requirements
│ Analyzer │
└─────────┬───────────┘
↓
┌─────────────────────┐
│ Matching Agent │ → Compares skills and requirements
└─────────┬───────────┘
↓
┌─────────────────────┐
│ Resume Rewriter │ → Tailors content to job
└─────────┬───────────┘
↓
┌─────────────────────┐
│ ATS Optimizer │ → Ensures ATS compatibility
└─────────┬───────────┘
↓
Structured Resume JSON
Purpose: Extract structured data from the master resume
Input: Raw resume text (PDF, DOCX, or plain text)
Output:
{
"skills": ["Java", "Spring Boot", "PostgreSQL"],
"experience": [{...}],
"projects": [{...}],
"education": [{...}]
}Responsibilities:
- Extract facts only—no rewriting
- Identify sections and categorize content
- Preserve original wording and achievements
Purpose: Understand job requirements and expectations
Input: Job description text
Output:
{
"requiredSkills": ["Java", "Microservices", "AWS"],
"preferredSkills": ["Docker", "Kubernetes"],
"keywords": ["RESTful APIs", "Agile", "CI/CD"],
"seniorityLevel": "Mid-Level",
"companyValues": ["Innovation", "Teamwork"]
}Responsibilities:
- Extract technical requirements
- Identify industry-specific keywords
- Determine seniority level and expectations
Purpose: Compare resume data with job requirements
Input:
- Parsed resume
- Job analysis
Output:
{
"matchedSkills": ["Java", "Spring Boot"],
"missingSkills": ["AWS", "Kubernetes"],
"matchScore": 75,
"focusAreas": ["Emphasize microservices experience", "Highlight teamwork"]
}Note: This agent uses deterministic logic, not AI, ensuring consistent and explainable matching.
Purpose: Rewrite resume content using job-specific language
Rules:
- ✅ Rephrase existing facts
- ✅ Emphasize matched skills
- ✅ Use job description terminology
- ❌ Never fabricate experience
- ❌ Never add skills not present in original resume
Output: Enhanced resume text (still unformatted)
Purpose: Ensure resume passes ATS filters
Responsibilities:
- Inject critical keywords naturally
- Use clean section headings
- Avoid tables, graphics, and complex formatting
- Ensure plain text compatibility
- Validate file structure
Output: ATS-ready resume content
ResumeAgent uses a canonical JSON structure as the single source of truth. This structure is:
- ✅ ATS-compatible
- ✅ Template-independent
- ✅ Versionable
- ✅ User-editable
- ✅ AI-safe (prevents hallucinations)
{
"metadata": {},
"header": {},
"summary": "",
"skills": {},
"experience": [],
"projects": [],
"education": [],
"certifications": [],
"achievements": [],
"publications": [],
"links": {},
"additional": {}
}{
"metadata": {
"resumeId": "uuid",
"userId": "uuid",
"generatedAt": "2026-01-01T18:30:00Z",
"jobTitleTargeted": "Backend Developer",
"companyTargeted": "Infosys",
"aiModelsUsed": ["meta-llama/llama-3.3-70b-instruct"],
"version": 3,
"language": "en",
"atsOptimized": true
}
}{
"header": {
"fullName": "Mohammad Umar Shaikh",
"location": "Pune, India",
"phone": "+91 9607056810",
"email": "mohammadumar.dev@gmail.com",
"headline": "Software Developer | Java & Spring Boot",
"links": {
"linkedin": "https://linkedin.com/in/shaikh-mohammad-umar",
"github": "https://github.com/mohammadumar-dev",
"portfolio": null
}
}
}{
"summary": "Software Developer with 1+ year of experience building scalable backend systems and REST APIs using Java and Spring Boot. Strong foundation in database design, concurrency, and system architecture. Experienced in Agile development, production deployments, and performance optimization."
}{
"skills": {
"languages": ["Java", "Python", "JavaScript", "TypeScript", "SQL"],
"frameworks": ["Spring Boot", "Spring Security", "JPA / Hibernate"],
"databases": ["PostgreSQL", "MySQL"],
"cloud_devops": ["Docker", "AWS (basic)", "Kubernetes (basic)"],
"tools": ["Git", "GitHub", "Postman", "IntelliJ IDEA", "Maven", "Flyway"],
"concepts": [
"REST APIs", "Microservices", "Service-Oriented Architecture",
"Multithreading", "Concurrency", "OOP", "Design Patterns",
"System Design", "Database Optimization", "SDLC", "Agile Methodologies"
]
}
}Benefits:
- Enables smart keyword injection
- Prevents duplication
- Allows flexible rendering (grouped or flat)
{
"experience": [
{
"role": "Software Developer",
"company": "Data Innovation Technologies Pvt Ltd",
"location": "Pune, India",
"employmentType": "Full-time",
"startDate": "2025-03",
"endDate": "Present",
"technologies": ["Java", "Spring Boot", "PostgreSQL", "JPA", "Docker"],
"responsibilities": [
"Developed scalable backend APIs using Java and Spring Boot serving production traffic.",
"Designed PostgreSQL schemas and optimized complex queries using JPA and Hibernate.",
"Participated in architectural discussions evaluating trade-offs in distributed systems.",
"Conducted code reviews and mentored junior developers on Spring best practices."
],
"achievements": [
"Improved API response time by 30% through query optimization.",
"Reduced production bugs by introducing structured exception handling."
]
}
]
}{
"projects": [
{
"name": "PathLab – Pathology Laboratory Management System",
"type": "Enterprise Backend System",
"technologies": ["Java", "Spring Boot", "PostgreSQL", "JPA", "JWT", "Docker", "Flyway"],
"description": "End-to-end laboratory information management system with role-based access and workflow automation.",
"highlights": [
"Implemented JWT-based authentication and RBAC for Admin, Lab Tech, Doctor, and Patient roles.",
"Optimized database queries and applied caching to improve performance by 40%.",
"Integrated email notifications and PDF generation using Freemarker.",
"Applied optimistic and pessimistic locking strategies for concurrent transactions."
]
}
]
}{
"education": [
{
"degree": "Bachelor of Engineering",
"field": "Computer Engineering",
"institution": "University Name",
"location": "India",
"startYear": 2020,
"endYear": 2024
}
]
}{
"certifications": [{...}],
"achievements": ["Solved 300+ DSA problems on coding platforms"],
"publications": [{...}],
"additional": {
"openSource": ["Contributor to ResumeAgent"],
"languagesSpoken": ["English", "Hindi"]
}
}ResumeAgent uses a normalized PostgreSQL schema designed for scalability, version control, and data integrity.
users (1) ──── (M) resumes (1) ──── (M) resume_versions
│
├──── (1) resume_header
├──── (1) resume_summary
├──── (M) resume_skills
├──── (M) resume_experience ──── (M) resume_experience_bullets
├──── (M) resume_projects ──── (M) resume_project_highlights
├──── (M) resume_education
├──── (M) resume_certifications
├──── (M) resume_achievements
├──── (M) resume_publications
├──── (M) resume_additional_sections
└──── (1) resume_metadata
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | User ID |
full_name |
VARCHAR(150) | User full name |
email |
VARCHAR(150) | Login / contact |
password_hash |
VARCHAR(255) | Password |
user_role |
VARCHAR(10) | USER / ADMIN |
plan |
VARCHAR(20) | FREE / PRO (future) |
resume_generation_limit |
INT | Allowed generations |
resume_generation_used |
INT | Used so far |
password_hash |
VARCHAR(255) | Hashed password |
is_email_active |
BOOLEAN | Email verification status |
created_at |
TIMESTAMP | Account creation |
updated_at |
TIMESTAMP | Last update |
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Resume ID |
user_id |
UUID (FK) | Owner |
job_title_targeted |
VARCHAR(150) | Target role |
company_targeted |
VARCHAR(150) | Target company |
current_version |
INT | Active version |
created_at |
TIMESTAMP | Created |
updated_at |
TIMESTAMP | Updated |
Critical for rollback and version control
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Version ID |
resume_id |
UUID (FK) | Parent resume |
version_number |
INT | Version number |
resume_json |
JSONB | Full canonical resume JSON |
source |
VARCHAR(50) | AI / USER / IMPORT |
created_at |
TIMESTAMP | Created |
Note: This table alone enables full version history and rollback capabilities.
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Row ID |
resume_id |
UUID (FK) | Resume |
full_name |
VARCHAR(150) | Name |
location |
VARCHAR(150) | City, country |
phone |
VARCHAR(50) | Phone |
email |
VARCHAR(150) | |
headline |
VARCHAR(200) | Short title |
linkedin |
TEXT | LinkedIn URL |
github |
TEXT | GitHub URL |
portfolio |
TEXT | Portfolio URL |
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Row ID |
resume_id |
UUID (FK) | Resume |
summary_text |
TEXT | Professional summary |
Categorized skills for smart keyword injection
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Row ID |
resume_id |
UUID (FK) | Resume |
category |
VARCHAR(50) | languages / frameworks / tools / concepts |
skill |
VARCHAR(100) | Skill name |
Example rows:
| id | resume_id | category | skill |
|----|-----------|-----------|-------------|
| 1 | abc-123 | languages | Java |
| 2 | abc-123 | frameworks| Spring Boot |
| 3 | abc-123 | tools | Docker |
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Experience ID |
resume_id |
UUID (FK) | Resume |
role |
VARCHAR(150) | Job title |
company |
VARCHAR(150) | Company |
location |
VARCHAR(150) | Location |
employment_type |
VARCHAR(50) | Full-time / Intern |
start_date |
DATE | Start |
end_date |
DATE | End or NULL |
technologies |
TEXT[] | Tech stack |
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Bullet ID |
experience_id |
UUID (FK) | Parent experience |
bullet_type |
VARCHAR(50) | responsibility / achievement |
content |
TEXT | Bullet text |
Why separate bullets?
- Enables individual bullet reordering
- Allows type-based filtering (responsibilities vs achievements)
- Simplifies AI rewriting of specific bullets
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Project ID |
resume_id |
UUID (FK) | Resume |
name |
VARCHAR(200) | Project name |
type |
VARCHAR(100) | Project type |
description |
TEXT | Short description |
technologies |
TEXT[] | Tech stack |
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Highlight ID |
project_id |
UUID (FK) | Project |
content |
TEXT | Highlight bullet |
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Education ID |
resume_id |
UUID (FK) | Resume |
degree |
VARCHAR(150) | Degree |
field |
VARCHAR(150) | Field |
institution |
VARCHAR(200) | College |
location |
VARCHAR(150) | Location |
start_year |
INT | Start |
end_year |
INT | End |
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Certification ID |
resume_id |
UUID (FK) | Resume |
name |
VARCHAR(200) | Cert name |
issuer |
VARCHAR(200) | Issuer |
year |
INT | Year |
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Achievement ID |
resume_id |
UUID (FK) | Resume |
content |
TEXT | Achievement |
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Publication ID |
resume_id |
UUID (FK) | Resume |
title |
VARCHAR(200) | Title |
platform |
VARCHAR(100) | Medium, Blog |
url |
TEXT | Link |
Extension point for custom sections
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Row ID |
resume_id |
UUID (FK) | Resume |
section_name |
VARCHAR(100) | Custom section |
content |
TEXT | Value |
Example:
| section_name | content |
|-------------------|--------------------------------------------|
| openSource | Contributor to ResumeAgent |
| languagesSpoken | English, Hindi |
| volunteer | Taught programming to underprivileged kids |
| Column | Type | Description |
|---|---|---|
resume_id |
UUID (PK/FK) | Resume |
generated_at |
TIMESTAMP | AI generation |
language |
VARCHAR(20) | Language |
ats_optimized |
BOOLEAN | ATS flag |
ai_models_used |
TEXT[] | Models |
pipeline_version |
VARCHAR(20) | Pipeline version |
Enables debugging, auditing, and research
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Log ID |
user_id |
UUID (FK → users.id) | Who |
resume_id |
UUID (FK) | Resume |
agent_name |
VARCHAR(100) | Parser / Matcher / Rewriter |
tokens_input |
INT | Prompt tokens |
created_at |
TIMESTAMP | Time |
Use cases:
- Debug AI agent behavior
- Analyze prompt effectiveness
- Improve AI training
- Audit AI decisions
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Token record ID |
user_id |
UUID (FK) | Associated user |
token |
VARCHAR(255) | Secure random token (hashed) |
expires_at |
TIMESTAMP | Token expiry time |
used |
BOOLEAN | Whether token is used |
created_at |
TIMESTAMP | Creation time |
used_at |
TIMESTAMP | Verification timestamp |
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Token ID |
user_id |
UUID (FK) | Associated user |
token |
VARCHAR(255) | Secure reset token (hashed) |
expires_at |
TIMESTAMP | Expiration time |
used |
BOOLEAN | Whether token was used |
created_at |
TIMESTAMP | Created |
used_at |
TIMESTAMP | When reset completed |
ip_address |
VARCHAR(45) | Request IP (optional) |
user_agent |
TEXT | Browser/device (optional) |
Prevents password reuse for security
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Record ID |
user_id |
UUID (FK) | User |
password_hash |
VARCHAR(255) | Hashed password |
created_at |
TIMESTAMP | When password was set |
| Column | Type | Description |
|---|---|---|
id |
UUID (PK) | Refresh token ID |
user_id |
UUID (FK) | Associated user |
token_hash |
VARCHAR(255) | Hashed refresh token (bcrypt/argon2, never plaintext) |
expires_at |
TIMESTAMP | Token expiration time |
revoked |
BOOLEAN | Whether the token has been revoked |
revoked_at |
TIMESTAMP | When the token was revoked |
replaced_by_token_id |
UUID (FK) | Token that replaced this one during rotation |
ip_address |
VARCHAR(45) | IP address where token was issued |
user_agent |
TEXT | Browser / device user agent |
created_at |
TIMESTAMP | Token creation timestamp |
last_used_at |
TIMESTAMP | Last time the token was used |
✅ Normalized: Eliminates data redundancy
✅ Scalable: Handles millions of resumes efficiently
✅ Versionable: Full history tracking with rollback
✅ Extensible: Easy to add new sections or fields
✅ ATS-Friendly: Structure mirrors resume logic
✅ Debuggable: Agent logs enable troubleshooting
✅ Secure: Proper token management and password handling
ResumeAgent uses DOCX templates with FreeMarker (FTL) placeholders to ensure professional, ATS-compatible output.
| Benefit | Explanation |
|---|---|
| ✅ Universally Accepted | DOCX is the industry standard |
| ✅ Fully Editable | Users can customize in Microsoft Word, Google Docs, LibreOffice |
| ✅ ATS-Friendly | Simple structure passes ATS parsers |
| ✅ Template Flexibility | Multiple templates for different industries |
| ✅ Version Control | Templates can be tracked in Git |
templates/
├── classic/
│ ├── template.docx # DOCX with FTL placeholders
│ └── preview.jpg # Template preview
├── modern/
│ ├── template.docx
│ └── preview.jpg
└── ats-optimized/
├── template.docx
└── preview.jpg
<!-- Inside template.docx (simplified XML) -->
<w:p>
<w:r>
<w:t>${header.fullName}</w:t>
</w:r>
</w:p>
<w:p>
<w:r>
<w:t>${header.location} | ${header.phone} | ${header.email}</w:t>
</w:r>
</w:p>
<!-- Professional Summary -->
<w:p>
<w:r>
<w:t>${summary}</w:t>
</w:r>
</w:p>
<!-- Experience Loop -->
<#list experience as exp>
<w:p>
<w:r>
<w:t>${exp.role} – ${exp.company}</w:t>
</w:r>
</w:p>
<#list exp.responsibilities as bullet>
<w:p>
<w:r>
<w:t>• ${bullet}</w:t>
</w:r>
</w:p>
</#list>
</#list>- Load Template: Read DOCX template file
- Parse JSON: Convert resume JSON to FreeMarker data model
- Inject Data: Replace placeholders with actual content
- Generate DOCX: Use docx4j or Apache POI to create final file
- Return to User: Provide download link
ATS Compatibility Guidelines:
- ✅ Use plain text (no text boxes or WordArt)
- ✅ Use standard fonts (Arial, Calibri, Times New Roman)
- ✅ Use simple bullet points
- ✅ Avoid tables for layout
- ✅ Use clear section headers
- ❌ No images or graphics
- ❌ No headers/footers with critical info
- ❌ No columns or complex layouts
- Java 21 (LTS)
- Maven 3.8+
- PostgreSQL 15+
- Node.js 18+ (for frontend)
- Docker (optional, for containerization)
git clone https://github.com/your-username/resume-agent.git
cd resume-agentCreate a PostgreSQL database:
psql -U postgres
CREATE DATABASE resume_agent;
CREATE USER resume_user WITH ENCRYPTED PASSWORD 'your_password';
GRANT ALL PRIVILEGES ON DATABASE resume_agent TO resume_user;Edit src/main/resources/application.properties:
# Database Configuration
spring.datasource.url=jdbc:postgresql://localhost:5432/resume_agent
spring.datasource.username=resume_user
spring.datasource.password=your_password
# JPA Configuration
spring.jpa.hibernate.ddl-auto=validate
spring.jpa.show-sql=true
# Liquibase
spring.liquibase.change-log=classpath:db/changelog/db.changelog-master.xml
# AI Configuration
spring.ai.openai.api-key=${OPENAI_API_KEY}
# OR
openrouter.api-key=${OPENROUTER_API_KEY}
# Server Configuration
server.port=8080export OPENAI_API_KEY=your_openai_key
# OR
export OPENROUTER_API_KEY=your_openrouter_key# Build the project
mvn clean install
# Run the application
mvn spring-boot:run
# OR build Docker image
docker build -t resume-agent:latest .
docker run -p 8080:8080 resume-agent:latestcurl http://localhost:8080/api/healthExpected response:
{
"status": "UP",
"version": "1.0.0"
}http://localhost:8080/api/v1
POST /resumes/generate
Request Body:
{
"masterResume": "base64_encoded_or_text",
"jobDescription": "Job description text",
"userId": "uuid",
"targetJobTitle": "Backend Developer",
"targetCompany": "Infosys"
}Response:
{
"resumeId": "uuid",
"downloadUrl": "/api/v1/resumes/uuid/download",
"status": "SUCCESS",
"metadata": {
"generatedAt": "2026-01-03T10:30:00Z",
"atsOptimized": true,
"aiModel": "meta-llama/llama-3.3-70b-instruct"
}
}GET /resumes/{resumeId}/download
Response: DOCX file download
GET /resumes/{resumeId}/versions
Response:
{
"resumeId": "uuid",
"currentVersion": 3,
"versions": [
{
"versionNumber": 1,
"createdAt": "2026-01-01T10:00:00Z",
"source": "AI"
},
{
"versionNumber": 2,
"createdAt": "2026-01-02T14:30:00Z",
"source": "USER"
},
{
"versionNumber": 3,
"createdAt": "2026-01-03T09:15:00Z",
"source": "AI"
}
]
}POST /resumes/{resumeId}/rollback
Request Body:
{
"versionNumber": 2
}GET /users/{userId}/resumes
Response:
{
"userId": "uuid",
"resumes": [
{
"resumeId": "uuid",
"jobTitle": "Backend Developer",
"company": "Infosys",
"createdAt": "2026-01-01T10:00:00Z",
"currentVersion": 2
}
]
}Author: Mohammad Umar Shaikh
- 📧 Email: mohammadumar.dev@gmail.com
- 💼 LinkedIn: linkedin.com/in/shaikh-mohammad-umar
- 🐙 GitHub: github.com/mohammadumar-dev
Project Repository: github.com/your-username/resume-agent
- 🐛 Bug Reports: Open an issue with the
buglabel - 💡 Feature Requests: Open an issue with the
enhancementlabel - ❓ Questions: Use GitHub Discussions or open an issue with the
questionlabel
- Spring Team for the excellent Spring Boot and Spring AI frameworks
- OpenAI, Anthropic, Meta for powerful LLM APIs
- FreeMarker Team for the template engine
- Apache POI & docx4j contributors for DOCX manipulation libraries
- PostgreSQL Community for a robust database system
- Open Source Community for inspiration and tools
ResumeAgent aims to become the industry-standard open-source platform for AI-driven resume optimization. Our goal is to empower job seekers worldwide with technology that:
- Levels the playing field in competitive job markets
- Eliminates ATS-related rejections for qualified candidates
- Provides transparency and control over AI-generated content
- Remains accessible, affordable, and privacy-focused
Join us in building the future of job applications!
Made with ❤️ by Mohammad Umar Shaikh | Yunus Bagewadi
⭐ Star this repo if you find it helpful!