# sellva77/ats architecture

> Architecture diagram of the GitHub repository sellva77/ats, generated by GitDiagram from its file tree, README and a sample of source files (last updated 2026-09-26). It is an AI-made overview: check details against the source.

- Interactive diagram: https://gitdiagram.com/sellva77/ats
- Repository: https://github.com/sellva77/ats

## Overview

This is an AI-powered applicant tracking system: recruiters upload resumes, the system extracts and profiles candidates, indexes them for semantic retrieval, and supports candidate search and application-pipeline management. The graph combines the documented ingestion/search architecture with sampled route, controller, and service behavior. Several broader ATS features are visible in the client and BFF tree but their detailed wiring was not sampled, so those links are limited to the documented application boundary.

Main entry points: [`BFF/src/controllers/candidate.controller.ts`](https://github.com/sellva77/ats/blob/main/BFF/src/controllers/candidate.controller.ts) (Candidate workflows), [`BFF/src/app.ts`](https://github.com/sellva77/ats/blob/main/BFF/src/app.ts) (BFF API), [`client/src/App.tsx`](https://github.com/sellva77/ats/blob/main/client/src/App.tsx) (ATS web app), [`ai-service/api/routes.py`](https://github.com/sellva77/ats/blob/main/ai-service/api/routes.py) (AI service API)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Recruiter client"]
  node_webapp["ATS web app<br/>[App.tsx]"]
  node_candidate_ui["Candidate workflows<br/>[UploadPage.tsx]"]
  node_search_ui["Candidate search<br/>[SearchPage.tsx]"]
  node_applications_ui["Applications"]
end

subgraph group_bff["API and recruiting"]
  node_api["BFF API<br/>[app.ts]"]
  node_candidate_controller["Candidate workflows"]
  node_application_controller["Application API"]
  node_application_service["Pipeline management"]
  node_profile_repository["Profile lookup"]
  node_ranking["Candidate ranking<br/>[ranking-engine.ts]"]
end

subgraph group_ai["AI processing"]
  node_ai_api["AI service API<br/>[routes.py]"]
  node_resume_pipeline["Resume profiling<br/>[pipeline.py]"]
  node_candidate_index["Index construction<br/>[index_builder.py]"]
  node_candidate_search["Semantic retrieval<br/>[search.py]"]
end

subgraph group_storage["Data stores"]
  node_postgres[("PostgreSQL<br/>[prisma.ts]")]
  node_minio[("Resume objects<br/>[minio.ts]")]
  node_qdrant[("Vector index<br/>[vector_store.py]")]
end

node_recruiter(("Recruiter"))

node_recruiter -->|"uses"| node_webapp
node_webapp -->|"opens"| node_candidate_ui
node_webapp -->|"opens"| node_search_ui
node_webapp -->|"opens"| node_applications_ui
node_candidate_ui -->|"upload request"| node_api
node_search_ui -->|"search request"| node_api
node_applications_ui -->|"pipeline requests"| node_api
node_api -->|"dispatches"| node_candidate_controller
node_api -->|"dispatches"| node_application_controller
node_candidate_controller -->|"stores resumes"| node_minio
node_candidate_controller -->|"stores profiles"| node_postgres
node_candidate_controller -->|"calls processing"| node_ai_api
node_ai_api -->|"parses resume"| node_resume_pipeline
node_resume_pipeline -->|"downloads PDF"| node_minio
node_ai_api -->|"builds index"| node_candidate_index
node_candidate_index -->|"upserts vectors"| node_qdrant
node_ai_api -->|"searches candidates"| node_candidate_search
node_candidate_search -->|"queries vectors"| node_qdrant
node_candidate_controller -->|"loads profiles"| node_profile_repository
node_candidate_controller -->|"ranks results"| node_ranking
node_application_controller -->|"manages pipeline"| node_application_service
node_application_service -->|"reads and writes"| node_postgres

click node_webapp "https://github.com/sellva77/ats/blob/main/client/src/App.tsx"
click node_candidate_ui "https://github.com/sellva77/ats/blob/main/client/src/pages/UploadPage.tsx"
click node_search_ui "https://github.com/sellva77/ats/blob/main/client/src/pages/SearchPage.tsx"
click node_applications_ui "https://github.com/sellva77/ats/blob/main/client/src/pages/ApplicationsPage.tsx"
click node_api "https://github.com/sellva77/ats/blob/main/BFF/src/app.ts"
click node_candidate_controller "https://github.com/sellva77/ats/blob/main/BFF/src/controllers/candidate.controller.ts"
click node_application_controller "https://github.com/sellva77/ats/blob/main/BFF/src/controllers/application.controller.ts"
click node_application_service "https://github.com/sellva77/ats/blob/main/BFF/src/services/application.service.ts"
click node_profile_repository "https://github.com/sellva77/ats/blob/main/BFF/src/repositories/candidate-profile.repository.ts"
click node_ranking "https://github.com/sellva77/ats/blob/main/BFF/src/ranking/ranking-engine.ts"
click node_ai_api "https://github.com/sellva77/ats/blob/main/ai-service/api/routes.py"
click node_resume_pipeline "https://github.com/sellva77/ats/blob/main/ai-service/services/resume/pipeline.py"
click node_candidate_index "https://github.com/sellva77/ats/blob/main/ai-service/services/candidate/index_builder.py"
click node_candidate_search "https://github.com/sellva77/ats/blob/main/ai-service/services/candidate/search.py"
click node_postgres "https://github.com/sellva77/ats/blob/main/BFF/src/config/prisma.ts"
click node_minio "https://github.com/sellva77/ats/blob/main/BFF/src/config/minio.ts"
click node_qdrant "https://github.com/sellva77/ats/blob/main/ai-service/services/vector_store.py"

classDef toneNeutral fill:#f8fafc,stroke:#334155,stroke-width:1.5px,color:#0f172a
classDef toneBlue fill:#dbeafe,stroke:#2563eb,stroke-width:1.5px,color:#172554
classDef toneAmber fill:#fef3c7,stroke:#d97706,stroke-width:1.5px,color:#78350f
classDef toneMint fill:#dcfce7,stroke:#16a34a,stroke-width:1.5px,color:#14532d
classDef toneRose fill:#ffe4e6,stroke:#e11d48,stroke-width:1.5px,color:#881337
classDef toneIndigo fill:#e0e7ff,stroke:#4f46e5,stroke-width:1.5px,color:#312e81
classDef toneTeal fill:#ccfbf1,stroke:#0f766e,stroke-width:1.5px,color:#134e4a
class node_webapp,node_candidate_ui,node_search_ui,node_applications_ui toneBlue
class node_api,node_candidate_controller,node_application_controller,node_application_service,node_profile_repository,node_ranking toneAmber
class node_ai_api,node_resume_pipeline,node_candidate_index,node_candidate_search toneMint
class node_postgres,node_minio,node_qdrant toneRose
class node_recruiter toneIndigo
```

## Components

### Recruiter client

- [ATS web app](https://github.com/sellva77/ats/blob/main/client/src/App.tsx): `client/src/App.tsx`
- [Candidate workflows](https://github.com/sellva77/ats/blob/main/client/src/pages/UploadPage.tsx): `client/src/pages/UploadPage.tsx`
- [Candidate search](https://github.com/sellva77/ats/blob/main/client/src/pages/SearchPage.tsx): `client/src/pages/SearchPage.tsx`
- [Applications](https://github.com/sellva77/ats/blob/main/client/src/pages/ApplicationsPage.tsx): `client/src/pages/ApplicationsPage.tsx`

### API and recruiting

- [BFF API](https://github.com/sellva77/ats/blob/main/BFF/src/app.ts): `BFF/src/app.ts`
- [Candidate workflows](https://github.com/sellva77/ats/blob/main/BFF/src/controllers/candidate.controller.ts): `BFF/src/controllers/candidate.controller.ts`
- [Application API](https://github.com/sellva77/ats/blob/main/BFF/src/controllers/application.controller.ts): `BFF/src/controllers/application.controller.ts`
- [Pipeline management](https://github.com/sellva77/ats/blob/main/BFF/src/services/application.service.ts): `BFF/src/services/application.service.ts`
- [Profile lookup](https://github.com/sellva77/ats/blob/main/BFF/src/repositories/candidate-profile.repository.ts): `BFF/src/repositories/candidate-profile.repository.ts`
- [Candidate ranking](https://github.com/sellva77/ats/blob/main/BFF/src/ranking/ranking-engine.ts): `BFF/src/ranking/ranking-engine.ts`

### AI processing

- [AI service API](https://github.com/sellva77/ats/blob/main/ai-service/api/routes.py): `ai-service/api/routes.py`
- [Resume profiling](https://github.com/sellva77/ats/blob/main/ai-service/services/resume/pipeline.py): `ai-service/services/resume/pipeline.py`
- [Index construction](https://github.com/sellva77/ats/blob/main/ai-service/services/candidate/index_builder.py): `ai-service/services/candidate/index_builder.py`
- [Semantic retrieval](https://github.com/sellva77/ats/blob/main/ai-service/services/candidate/search.py): `ai-service/services/candidate/search.py`

### Data stores

- [PostgreSQL](https://github.com/sellva77/ats/blob/main/BFF/src/config/prisma.ts): `BFF/src/config/prisma.ts`
- [Resume objects](https://github.com/sellva77/ats/blob/main/BFF/src/config/minio.ts): `BFF/src/config/minio.ts`
- [Vector index](https://github.com/sellva77/ats/blob/main/ai-service/services/vector_store.py): `ai-service/services/vector_store.py`

### Other components

- **Recruiter**

## Connections

- Recruiter → ATS web app: uses
- ATS web app → Candidate workflows: opens
- ATS web app → Candidate search: opens
- ATS web app → Applications: opens
- Candidate workflows → BFF API: upload request
- Candidate search → BFF API: search request
- Applications → BFF API: pipeline requests
- BFF API → Candidate workflows: dispatches
- BFF API → Application API: dispatches
- Candidate workflows → Resume objects: stores resumes
- Candidate workflows → PostgreSQL: stores profiles
- Candidate workflows → AI service API: calls processing
- AI service API → Resume profiling: parses resume
- Resume profiling → Resume objects: downloads PDF
- AI service API → Index construction: builds index
- Index construction → Vector index: upserts vectors
- AI service API → Semantic retrieval: searches candidates
- Semantic retrieval → Vector index: queries vectors
- Candidate workflows → Profile lookup: loads profiles
- Candidate workflows → Candidate ranking: ranks results
- Application API → Pipeline management: manages pipeline
- Pipeline management → PostgreSQL: reads and writes
