Skip to content
cd ../work

A 5-agent AI pipeline that turns one master resume into job-specific, ATS-optimized documents.

2025 · AI / Career Tech · role: owner

● status: production·11 services·~2 min read

Java 21Spring Boot 3.xSpring AISpring SecurityPostgreSQL JSONBFreeMarkerNext.jsDockerGitHub Actions

01 — overview

What it is

ResumeAgent converts a candidate's master resume into tailored, ATS-compliant DOCX files for each job application. Five specialized AI agents run as a sequential pipeline — each with a single responsibility — while a canonical JSON resume model keeps every step structured and auditable.

02 — the problem

Why it exists

Qualified candidates get filtered out by Applicant Tracking Systems before a human ever reads their resume, and manually re-tailoring a resume for every posting doesn't scale.

Existing AI resume tools hand the LLM full control of the document — producing verbose, unstructured, sometimes factually wrong output with formatting that breaks in ATS parsers.

03 — architecture

How it's built

A layered pipeline separates AI reasoning from rendering. The REST API feeds the pipeline service, which orchestrates five agents over a structured JSON contract; a model-agnostic LLM layer swaps providers freely; deterministic FreeMarker templates render the final DOCX.

architecture — how requests flowlive
Next.js ClientSpring Boot APIJWT · RSA key-pairPipeline ServiceorchestratorParser AgentJD AnalyzerSemantic MatcherRewriter AgentATS OptimizerLLM LayerOpenAI · Claude · OllamaFreeMarker → DOCXdeterministicPostgreSQLJSONB versioning

04 — engineering decisions

The choices that mattered

01

AI generates content; templates control layout

The core design decision: the LLM never touches formatting. Agents emit structured JSON, and FreeMarker templates render it into DOCX deterministically — eliminating the formatting hallucinations that plague AI resume tools.

02

Model-agnostic LLM layer

One abstraction serves OpenAI, Claude, Llama, and local Ollama models (plus OpenRouter). Providers swap via configuration, keeping token costs controllable and avoiding vendor lock-in.

03

Canonical JSON resume model

Every resume lives as versioned JSONB in PostgreSQL — a single structured source of truth that powers version tracking, diffing between tailored variants, and auditable agent outputs.

04

Security as a first-class feature

RSA key-pair JWT authentication, resume version history, and Spring Security guardrails — because a career platform holds some of a user's most personal data.

Explain this project

A sequential five-agent pipeline (parser → JD analyzer → semantic matcher → rewriter → ATS optimizer) in Java 21 / Spring Boot, coordinated over a canonical JSON resume model stored as versioned JSONB in PostgreSQL. The core design decision is separating reasoning from rendering: agents emit only structured JSON, and deterministic FreeMarker templates produce the DOCX — which removes the formatting hallucinations typical of LLM resume tools. A model-agnostic LLM layer (OpenAI, Claude, Llama, Ollama, OpenRouter) swaps providers by config, and RSA key-pair JWT secures the API.

05 — features

What it does

  • 5-agent sequential pipeline: parse → analyze JD → match → rewrite → optimize
  • Job-specific, keyword-aligned ATS output
  • Fully editable DOCX deliverables — never locked PDFs
  • Resume versioning with PostgreSQL JSONB persistence
  • Model-agnostic: OpenAI, Claude, Llama, Ollama, OpenRouter
  • Dockerized monorepo with CI/CD via GitHub Actions

06 — stack

What it runs on

Backend
Java 21Spring Boot 3.xSpring AISpring Security
Data
PostgreSQL 15+ (JSONB)Resume version history
AI
OpenAIAnthropic ClaudeLlamaOllamaOpenRouter
Rendering
FreeMarker templatesDOCX output
Ops
Docker / docker-composeGitHub Actions

Want the full story?

The repository has the code, the commits, and the decisions in context — or reach out and I'll walk you through it.