# shastri211/hiring_automation architecture

> Architecture diagram of the GitHub repository shastri211/hiring_automation, 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/shastri211/hiring_automation
- Repository: https://github.com/shastri211/hiring_automation

## Overview

Resume Screener is a multi-tenant hiring application whose main workflow runs from job setup and resume submission through profiling, candidate resolution, semantic screening, and HR follow-up. The React frontend calls FastAPI routes; resume work and screening are dispatched to a Redis Streams worker. The README documents the broader product capabilities, while the sampled source confirms API registration, worker dispatch, and ZIP ingestion/storage details. Arrows for unsampled service internals follow documented behavior; uncertain module-level wiring is omitted.

Main entry points: [`frontend-v2/src/api`](https://github.com/shastri211/hiring_automation/tree/main/frontend-v2/src/api) (Frontend API clients), [`app/services/orchestrator.py`](https://github.com/shastri211/hiring_automation/blob/main/app/services/orchestrator.py) (Resume processing), [`app/services/screener.py`](https://github.com/shastri211/hiring_automation/blob/main/app/services/screener.py) (Screening decisions), [`app/models`](https://github.com/shastri211/hiring_automation/tree/main/app/models) (PostgreSQL)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["User experience"]
  node_frontend["Hiring workspace"]
  node_publicpages["Public apply/interview"]
  node_webapi["Frontend API clients"]
end

subgraph group_api["HTTP application"]
  node_jobsapi["Job setup<br/>[jobs.py]"]
  node_resumesapi["Resume submissions<br/>[resumes.py]"]
  node_publicapi["Public applications"]
  node_interviewsapi["Interview endpoints<br/>[interviews.py]"]
  node_otherapi["Hiring endpoints"]
end

subgraph group_processing["Hiring workflows"]
  node_jobprofile["Job profiling<br/>[profiler.py]"]
  node_queue["Task queue<br/>[queue.py]"]
  node_worker["Background worker<br/>[worker.py]"]
  node_orchestrator["Resume processing<br/>[orchestrator.py]"]
  node_extract["Text extraction"]
  node_identity["Candidate resolution"]
  node_embeddings["Semantic matching<br/>[embeddings.py]"]
  node_screener["Screening decisions<br/>[screener.py]"]
  node_followup["HR follow-up"]
end

subgraph group_state["Application state"]
  node_database[("PostgreSQL")]
  node_vectors[("Qdrant<br/>[vector_store.py]")]
  node_redis["Redis Streams<br/>[queue.py]"]
end

subgraph group_integrations["External providers"]
  node_llm{{"LLM providers"}}
  node_smtp{{"SMTP email"}}
  node_dograh{{"Dograh voice"}}
end

node_hr(("HR user"))
node_applicant(("Applicant"))

node_hr -->|"uses"| node_frontend
node_applicant -->|"submits"| node_publicpages
node_frontend -->|"requests"| node_webapi
node_publicpages -->|"requests"| node_webapi
node_webapi -->|"calls"| node_jobsapi
node_webapi -->|"calls"| node_resumesapi
node_webapi -->|"calls"| node_publicapi
node_webapi -->|"calls"| node_interviewsapi
node_webapi -->|"calls"| node_otherapi
node_jobsapi -->|"profiles job"| node_jobprofile
node_jobprofile -->|"structures description"| node_llm
node_jobsapi -->|"stores jobs"| node_database
node_resumesapi -->|"enqueues work"| node_queue
node_publicapi -->|"enqueues work"| node_queue
node_queue -->|"stores tasks"| node_redis
node_worker -->|"consumes tasks"| node_redis
node_worker -->|"dispatches resumes"| node_orchestrator
node_worker -->|"dispatches screening"| node_screener
node_orchestrator -->|"extracts text"| node_extract
node_orchestrator -->|"resolves candidate"| node_identity
node_orchestrator -->|"creates vectors"| node_embeddings
node_extract -.->|"fallback profiling"| node_llm
node_embeddings -->|"stores vectors"| node_vectors
node_screener -->|"ranks candidates"| node_vectors
node_screener -->|"evaluates matches"| node_llm
node_orchestrator -->|"records resumes"| node_database
node_screener -->|"records decisions"| node_database
node_otherapi -->|"handles outreach and analytics"| node_followup
node_followup -->|"reads and writes"| node_database
node_followup -.->|"sends email"| node_smtp
node_interviewsapi -.->|"connects interviews"| node_dograh
node_dograh -.->|"sends webhooks"| node_otherapi

click node_frontend "https://github.com/shastri211/hiring_automation/tree/main/frontend-v2/src/pages"
click node_publicpages "https://github.com/shastri211/hiring_automation/tree/main/frontend-v2/src/pages"
click node_webapi "https://github.com/shastri211/hiring_automation/tree/main/frontend-v2/src/api"
click node_jobsapi "https://github.com/shastri211/hiring_automation/blob/main/app/api/jobs.py"
click node_resumesapi "https://github.com/shastri211/hiring_automation/blob/main/app/api/resumes.py"
click node_publicapi "https://github.com/shastri211/hiring_automation/blob/main/app/api/public_application.py"
click node_interviewsapi "https://github.com/shastri211/hiring_automation/blob/main/app/api/interviews.py"
click node_otherapi "https://github.com/shastri211/hiring_automation/tree/main/app/api"
click node_jobprofile "https://github.com/shastri211/hiring_automation/blob/main/app/services/profiler.py"
click node_queue "https://github.com/shastri211/hiring_automation/blob/main/app/services/queue.py"
click node_worker "https://github.com/shastri211/hiring_automation/blob/main/app/worker.py"
click node_orchestrator "https://github.com/shastri211/hiring_automation/blob/main/app/services/orchestrator.py"
click node_extract "https://github.com/shastri211/hiring_automation/tree/main/app/services/extractor"
click node_identity "https://github.com/shastri211/hiring_automation/blob/main/app/services/candidate_identity.py"
click node_embeddings "https://github.com/shastri211/hiring_automation/blob/main/app/services/embeddings.py"
click node_screener "https://github.com/shastri211/hiring_automation/blob/main/app/services/screener.py"
click node_followup "https://github.com/shastri211/hiring_automation/tree/main/app/services"
click node_database "https://github.com/shastri211/hiring_automation/tree/main/app/models"
click node_vectors "https://github.com/shastri211/hiring_automation/blob/main/app/services/vector_store.py"
click node_redis "https://github.com/shastri211/hiring_automation/blob/main/app/services/queue.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_frontend,node_publicpages,node_webapi,node_hr toneBlue
class node_jobsapi,node_resumesapi,node_publicapi,node_interviewsapi,node_otherapi toneAmber
class node_jobprofile,node_queue,node_worker,node_orchestrator,node_extract,node_identity,node_embeddings,node_screener,node_followup toneMint
class node_database,node_vectors,node_redis toneRose
class node_llm,node_smtp,node_dograh,node_applicant toneIndigo
```

## Components

### User experience

- [Hiring workspace](https://github.com/shastri211/hiring_automation/tree/main/frontend-v2/src/pages): `frontend-v2/src/pages`
- [Public apply/interview](https://github.com/shastri211/hiring_automation/tree/main/frontend-v2/src/pages): `frontend-v2/src/pages`
- [Frontend API clients](https://github.com/shastri211/hiring_automation/tree/main/frontend-v2/src/api): `frontend-v2/src/api`

### HTTP application

- [Job setup](https://github.com/shastri211/hiring_automation/blob/main/app/api/jobs.py): `app/api/jobs.py`
- [Resume submissions](https://github.com/shastri211/hiring_automation/blob/main/app/api/resumes.py): `app/api/resumes.py`
- [Public applications](https://github.com/shastri211/hiring_automation/blob/main/app/api/public_application.py): `app/api/public_application.py`
- [Interview endpoints](https://github.com/shastri211/hiring_automation/blob/main/app/api/interviews.py): `app/api/interviews.py`
- [Hiring endpoints](https://github.com/shastri211/hiring_automation/tree/main/app/api): `app/api`

### Hiring workflows

- [Job profiling](https://github.com/shastri211/hiring_automation/blob/main/app/services/profiler.py): `app/services/profiler.py`
- [Task queue](https://github.com/shastri211/hiring_automation/blob/main/app/services/queue.py): `app/services/queue.py`
- [Background worker](https://github.com/shastri211/hiring_automation/blob/main/app/worker.py): `app/worker.py`
- [Resume processing](https://github.com/shastri211/hiring_automation/blob/main/app/services/orchestrator.py): `app/services/orchestrator.py`
- [Text extraction](https://github.com/shastri211/hiring_automation/tree/main/app/services/extractor): `app/services/extractor`
- [Candidate resolution](https://github.com/shastri211/hiring_automation/blob/main/app/services/candidate_identity.py): `app/services/candidate_identity.py`
- [Semantic matching](https://github.com/shastri211/hiring_automation/blob/main/app/services/embeddings.py): `app/services/embeddings.py`
- [Screening decisions](https://github.com/shastri211/hiring_automation/blob/main/app/services/screener.py): `app/services/screener.py`
- [HR follow-up](https://github.com/shastri211/hiring_automation/tree/main/app/services): `app/services`

### Application state

- [PostgreSQL](https://github.com/shastri211/hiring_automation/tree/main/app/models): `app/models`
- [Qdrant](https://github.com/shastri211/hiring_automation/blob/main/app/services/vector_store.py): `app/services/vector_store.py`
- [Redis Streams](https://github.com/shastri211/hiring_automation/blob/main/app/services/queue.py): `app/services/queue.py`

### External providers

- **LLM providers**
- **SMTP email**
- **Dograh voice**

### Other components

- **HR user**
- **Applicant**

## Connections

- HR user → Hiring workspace: uses
- Applicant → Public apply/interview: submits
- Hiring workspace → Frontend API clients: requests
- Public apply/interview → Frontend API clients: requests
- Frontend API clients → Job setup: calls
- Frontend API clients → Resume submissions: calls
- Frontend API clients → Public applications: calls
- Frontend API clients → Interview endpoints: calls
- Frontend API clients → Hiring endpoints: calls
- Job setup → Job profiling: profiles job
- Job profiling → LLM providers: structures description
- Job setup → PostgreSQL: stores jobs
- Resume submissions → Task queue: enqueues work
- Public applications → Task queue: enqueues work
- Task queue → Redis Streams: stores tasks
- Background worker → Redis Streams: consumes tasks
- Background worker → Resume processing: dispatches resumes
- Background worker → Screening decisions: dispatches screening
- Resume processing → Text extraction: extracts text
- Resume processing → Candidate resolution: resolves candidate
- Resume processing → Semantic matching: creates vectors
- Text extraction → LLM providers: fallback profiling
- Semantic matching → Qdrant: stores vectors
- Screening decisions → Qdrant: ranks candidates
- Screening decisions → LLM providers: evaluates matches
- Resume processing → PostgreSQL: records resumes
- Screening decisions → PostgreSQL: records decisions
- Hiring endpoints → HR follow-up: handles outreach and analytics
- HR follow-up → PostgreSQL: reads and writes
- HR follow-up → SMTP email: sends email
- Interview endpoints → Dograh voice: connects interviews
- Dograh voice → Hiring endpoints: sends webhooks
