This repository contains a small applicant-tracking system (ATS) proof-of-concept that matches CVs to job descriptions using AI-assisted matching and a reviewer workflow. It provides a frontend UI and a Spring Boot backend which persists data to PostgreSQL and applies schema migrations with Flyway.
- Frontend:
ats-frontend— Vite + Vue 3 application that provides candidate, job, and reviewer UIs. - Backend:
cv-job-ai-matcher/backend— Spring Boot 3.3.5 application (Java 17) exposing a REST API, using Spring Data JPA, Flyway for migrations, and PostgreSQL as the primary datastore. - Database: PostgreSQL (expected database name
cv_matcher). Flyway migration scripts live undersrc/main/resources/db/migrationinside the backend. - AI / Models: The backend integrates with an LLM endpoint (configured with
ollama.base-url/OLLAMA_BASE_URL) and can use OpenAI-style models for scoring and matching.
- Project layout (backend): standard Spring Boot modules:
controller,service,repository,model,dto,config, andexceptionpackages. Persistence uses JPA entities and repositories. - Migrations: Flyway runs at startup to apply SQL migrations. Because Flyway opens a DB connection at application startup, the database must be reachable before
mvn spring-boot:runcompletes. - Configuration: Core settings are in
backend/src/main/resources/application.yml. Important values:spring.datasource.url— defaultjdbc:postgresql://localhost:5433/cv_matcherspring.datasource.username— defaultpostgresspring.datasource.password— defaultpostgresollama.base-url— local LLM host defaulthttp://localhost:11434
- Start PostgreSQL (example using Docker):
docker run -d --name cv_pg -e POSTGRES_PASSWORD=postgres -e POSTGRES_USER=postgres -e POSTGRES_DB=cv_matcher -p 5433:5432 postgres:15- Then run the backend:
cd cv-job-ai-matcher/backend
mvn spring-boot:run- Alternatively, map
SPRING_DATASOURCE_URL/SPRING_DATASOURCE_USERNAME/SPRING_DATASOURCE_PASSWORDenvironment variables to point to any existing Postgres instance.
Note: paths are relative to the backend server root (default port 8080). The following is a concise list of public REST endpoints and their typical input/output shapes.
-
Register user
- Method:
POST/api/auth/register - Input (JSON): { "username": "string", "email": "string", "password": "string" }
- Output (201): { "id": number, "username": "string", "email": "string" }
- Method:
-
Login
- Method:
POST/api/auth/login - Input (JSON): { "username": "string", "password": "string" }
- Output (200): { "token": "jwt-token-string" }
- Method:
-
Upload CV
- Method:
POST/api/cvs/upload - Input: multipart/form-data with
file(PDF) and optionaluserId - Output (201): { "id": number, "filename": "string", "uploadedAt": "ISO8601" }
- Method:
-
Get CV by id
- Method:
GET/api/cvs/{id} - Output (200): { "id": number, "filename": "string", "textExtract": "string", "metadata": {...} }
- Method:
-
Create Job
- Method:
POST/api/jobs - Input (JSON): { "title": "string", "description": "string", "ownerId": number }
- Output (201): { "id": number, "title": "string", "description": "string" }
- Method:
-
List Jobs
- Method:
GET/api/jobs - Output (200): [ { "id": number, "title": "string", ... }, ... ]
- Method:
-
Create Match
- Method:
POST/api/matches - Input (JSON): { "cvId": number, "jobId": number }
- Output (201): { "id": number, "score": number, "explanation": "string" }
- Method:
-
Reviewer Reports
- Method:
GET/api/reviewer/{reviewerId}/reports - Output (200): [ { "reportId": number, "matchId": number, "feedback": null|{...} }, ... ]
- Method:
Where inputs are simplified DTOs — see the backend/src/main/java/com/cvmatcher/dto package for exact field names and validation rules.
- If Flyway fails at startup with a DB connection error, ensure the Postgres container is running and reachable at the host/port in
application.yml(the default is hostlocalhost, port5433). - If you prefer automatic DB startup, add a
docker-compose.ymlthat defines adbservice and run it beforemvn spring-boot:run, or use a small wrapper script:
docker compose up -d db || docker run -d --name cv_pg -e POSTGRES_PASSWORD=postgres -e POSTGRES_DB=cv_matcher -p 5433:5432 postgres:15
mvn spring-boot:run- Backend services:
cv-job-ai-matcher/backend - Frontend:
ats-frontend
If you want, I can add a docker-compose.yml and a run script to this repo so the DB starts automatically when developing.