# nshathish/cvtailr architecture

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

- Interactive diagram: https://gitdiagram.com/nshathish/cvtailr
- Repository: https://github.com/nshathish/cvtailr

## Overview

CVTailr is a CV tailoring and interview-preparation application. A user submits a CV and job description; the API parses them, scores the match, and creates a job record. The user can request AI-assisted tailoring, review and apply selected changes to a per-job CV, then practice and track evidence through drills and a ledger. The graph reflects the endpoint, client, service, and repository structure in the tree; several endpoint-to-service connections are inferred from matching names, since those source files were not sampled.

Main entry points: [`CvTailr.Api/CvTailr.Api/Services/TailoringService.cs`](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/TailoringService.cs) (Tailoring service), [`CvTailr.Api/CvTailr.Api/Services/DrillService.cs`](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/DrillService.cs) (Drill service), [`CvTailr.Api/CvTailr.Api/Data/CosmosCvRepository.cs`](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Data/CosmosCvRepository.cs) (CV repository), [`CvTailr.Api/CvTailr.Api/Endpoints/CvEndpoints.cs`](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/CvEndpoints.cs) (CV endpoints)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Web application"]
  node_webapp["Web app<br/>[Program.cs]"]
  node_cvclient["CV client<br/>[CvApiClient.cs]"]
  node_jdclient["JD client<br/>[JdApiClient.cs]"]
  node_jobsclient["Jobs client<br/>[JobsApiClient.cs]"]
  node_scoreclient["Scoring client<br/>[ScoreApiClient.cs]"]
  node_tailorclient["Tailoring client<br/>[TailorApiClient.cs]"]
  node_workflow["Workflow state"]
end

subgraph group_api["API workflow"]
  node_cvendpoint["CV endpoints<br/>[CvEndpoints.cs]"]
  node_jdendpoint["JD endpoints<br/>[JdEndpoints.cs]"]
  node_jobendpoint["Job endpoints<br/>[JobEndpoints.cs]"]
  node_scoreendpoint["Scoring endpoints"]
  node_cvparse["CV parsing"]
  node_jdparse["JD parsing"]
  node_jdresolve["JD source resolver"]
  node_scoring["Match scoring<br/>[ScoringService.cs]"]
  node_jobservice["Job workflow<br/>[JobService.cs]"]
  node_foundryclient["Foundry client<br/>[FoundryClient.cs]"]
end

subgraph group_prep["Tailoring and practice"]
  node_tailorendpoint["Tailoring endpoints"]
  node_ledgerendpoint["Ledger endpoints<br/>[LedgerEndpoints.cs]"]
  node_drillendpoint["Drill endpoints<br/>[DrillEndpoints.cs]"]
  node_tailoring["Tailoring service"]
  node_ledger["Preparation ledger<br/>[LedgerService.cs]"]
  node_drill["Drill service<br/>[DrillService.cs]"]
end

subgraph group_data["Persistence"]
  node_cvrepo["CV repository"]
  node_jobrepo["Job repository"]
  node_tailoredrepo["Tailored CV repository"]
  node_ledgerrepo["Ledger repository"]
end

subgraph group_shared["Domain models"]
  node_cvmodel["CV models<br/>[CvDocument.cs]"]
  node_jdmodel["JD requirements<br/>[JdRequirements.cs]"]
  node_jobmodel["Job records<br/>[Job.cs]"]
end

node_user(("User"))
node_cosmos[("Cosmos DB")]
node_foundry["Azure AI Foundry"]
node_firecrawl["Firecrawl"]

node_user -->|"uses"| node_webapp
node_webapp -->|"maintains state"| node_workflow
node_cvclient -->|"calls CV routes"| node_cvendpoint
node_jdclient -->|"calls JD routes"| node_jdendpoint
node_jobsclient -->|"calls job routes"| node_jobendpoint
node_scoreclient -->|"calls scoring routes"| node_scoreendpoint
node_tailorclient -->|"calls tailoring routes"| node_tailorendpoint
node_cvendpoint -->|"parses CV"| node_cvparse
node_jdendpoint -->|"parses JD"| node_jdparse
node_jdparse -->|"resolves source"| node_jdresolve
node_jdresolve -.->|"fetches source"| node_firecrawl
node_scoreendpoint -->|"scores match"| node_scoring
node_tailorendpoint -->|"proposes or applies"| node_tailoring
node_ledgerendpoint -->|"manages evidence"| node_ledger
node_drillendpoint -->|"generates and evaluates"| node_drill
node_tailoring -->|"requests completion"| node_foundryclient
node_drill -->|"requests completion"| node_foundryclient
node_foundryclient -->|"sends inference request"| node_foundry
node_cvendpoint -->|"loads or saves CV"| node_cvrepo
node_jobservice -->|"reads and writes jobs"| node_jobrepo
node_tailoring -->|"loads source CV"| node_cvrepo
node_tailoring -->|"stores tailored CV"| node_tailoredrepo
node_ledger -->|"reads and writes entries"| node_ledgerrepo
node_ledger -->|"updates tailored CV"| node_tailoredrepo
node_drill -->|"loads drill evidence"| node_ledgerrepo
node_drill -->|"loads fallback CV"| node_cvrepo
node_cvrepo -->|"persists CV"| node_cosmos
node_jobrepo -->|"persists jobs"| node_cosmos
node_tailoredrepo -->|"persists tailored CV"| node_cosmos
node_ledgerrepo -->|"persists ledger"| node_cosmos

click node_webapp "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Program.cs"
click node_cvclient "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Services/CvApiClient.cs"
click node_jdclient "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Services/JdApiClient.cs"
click node_jobsclient "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Services/JobsApiClient.cs"
click node_scoreclient "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Services/ScoreApiClient.cs"
click node_tailorclient "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Services/TailorApiClient.cs"
click node_workflow "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Services/WorkflowStateService.cs"
click node_cvendpoint "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/CvEndpoints.cs"
click node_jdendpoint "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/JdEndpoints.cs"
click node_jobendpoint "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/JobEndpoints.cs"
click node_scoreendpoint "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/ScoringEndpoints.cs"
click node_tailorendpoint "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/TailoringEndpoints.cs"
click node_ledgerendpoint "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/LedgerEndpoints.cs"
click node_drillendpoint "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/DrillEndpoints.cs"
click node_cvparse "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/CvParsingService.cs"
click node_jdparse "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/JdParsingService.cs"
click node_jdresolve "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/FirecrawlJdSourceResolver.cs"
click node_scoring "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/ScoringService.cs"
click node_jobservice "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/JobService.cs"
click node_tailoring "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/TailoringService.cs"
click node_ledger "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/LedgerService.cs"
click node_drill "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/DrillService.cs"
click node_foundryclient "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Clients/FoundryClient.cs"
click node_cvrepo "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Data/CosmosCvRepository.cs"
click node_jobrepo "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Data/CosmosJobRepository.cs"
click node_tailoredrepo "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Data/CosmosTailoredCvRepository.cs"
click node_ledgerrepo "https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Data/CosmosLedgerRepository.cs"
click node_cvmodel "https://github.com/nshathish/cvtailr/blob/main/CVTailr.Shared/CVTailr.Shared/Cv/CvDocument.cs"
click node_jdmodel "https://github.com/nshathish/cvtailr/blob/main/CVTailr.Shared/CVTailr.Shared/Jd/JdRequirements.cs"
click node_jobmodel "https://github.com/nshathish/cvtailr/blob/main/CVTailr.Shared/CVTailr.Shared/Jobs/Job.cs"

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_cvclient,node_jdclient,node_jobsclient,node_scoreclient,node_tailorclient,node_workflow,node_user toneBlue
class node_cvendpoint,node_jdendpoint,node_jobendpoint,node_scoreendpoint,node_cvparse,node_jdparse,node_jdresolve,node_scoring,node_jobservice,node_foundryclient,node_cosmos toneAmber
class node_tailorendpoint,node_ledgerendpoint,node_drillendpoint,node_tailoring,node_ledger,node_drill toneMint
class node_cvrepo,node_jobrepo,node_tailoredrepo,node_ledgerrepo toneRose
class node_cvmodel,node_jdmodel,node_jobmodel,node_foundry,node_firecrawl toneIndigo
```

## Components

### Web application

- [Web app](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Program.cs): `CvTailr.Web/CvTailr.Web/Program.cs`
- [CV client](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Services/CvApiClient.cs): `CvTailr.Web/CvTailr.Web/Services/CvApiClient.cs`
- [JD client](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Services/JdApiClient.cs): `CvTailr.Web/CvTailr.Web/Services/JdApiClient.cs`
- [Jobs client](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Services/JobsApiClient.cs): `CvTailr.Web/CvTailr.Web/Services/JobsApiClient.cs`
- [Scoring client](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Services/ScoreApiClient.cs): `CvTailr.Web/CvTailr.Web/Services/ScoreApiClient.cs`
- [Tailoring client](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Services/TailorApiClient.cs): `CvTailr.Web/CvTailr.Web/Services/TailorApiClient.cs`
- [Workflow state](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Web/CvTailr.Web/Services/WorkflowStateService.cs): `CvTailr.Web/CvTailr.Web/Services/WorkflowStateService.cs`

### API workflow

- [CV endpoints](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/CvEndpoints.cs): `CvTailr.Api/CvTailr.Api/Endpoints/CvEndpoints.cs`
- [JD endpoints](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/JdEndpoints.cs): `CvTailr.Api/CvTailr.Api/Endpoints/JdEndpoints.cs`
- [Job endpoints](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/JobEndpoints.cs): `CvTailr.Api/CvTailr.Api/Endpoints/JobEndpoints.cs`
- [Scoring endpoints](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/ScoringEndpoints.cs): `CvTailr.Api/CvTailr.Api/Endpoints/ScoringEndpoints.cs`
- [CV parsing](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/CvParsingService.cs): `CvTailr.Api/CvTailr.Api/Services/CvParsingService.cs`
- [JD parsing](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/JdParsingService.cs): `CvTailr.Api/CvTailr.Api/Services/JdParsingService.cs`
- [JD source resolver](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/FirecrawlJdSourceResolver.cs): `CvTailr.Api/CvTailr.Api/Services/FirecrawlJdSourceResolver.cs`
- [Match scoring](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/ScoringService.cs): `CvTailr.Api/CvTailr.Api/Services/ScoringService.cs`
- [Job workflow](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/JobService.cs): `CvTailr.Api/CvTailr.Api/Services/JobService.cs`
- [Foundry client](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Clients/FoundryClient.cs): `CvTailr.Api/CvTailr.Api/Clients/FoundryClient.cs`

### Tailoring and practice

- [Tailoring endpoints](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/TailoringEndpoints.cs): `CvTailr.Api/CvTailr.Api/Endpoints/TailoringEndpoints.cs`
- [Ledger endpoints](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/LedgerEndpoints.cs): `CvTailr.Api/CvTailr.Api/Endpoints/LedgerEndpoints.cs`
- [Drill endpoints](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Endpoints/DrillEndpoints.cs): `CvTailr.Api/CvTailr.Api/Endpoints/DrillEndpoints.cs`
- [Tailoring service](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/TailoringService.cs): `CvTailr.Api/CvTailr.Api/Services/TailoringService.cs`
- [Preparation ledger](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/LedgerService.cs): `CvTailr.Api/CvTailr.Api/Services/LedgerService.cs`
- [Drill service](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Services/DrillService.cs): `CvTailr.Api/CvTailr.Api/Services/DrillService.cs`

### Persistence

- [CV repository](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Data/CosmosCvRepository.cs): `CvTailr.Api/CvTailr.Api/Data/CosmosCvRepository.cs`
- [Job repository](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Data/CosmosJobRepository.cs): `CvTailr.Api/CvTailr.Api/Data/CosmosJobRepository.cs`
- [Tailored CV repository](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Data/CosmosTailoredCvRepository.cs): `CvTailr.Api/CvTailr.Api/Data/CosmosTailoredCvRepository.cs`
- [Ledger repository](https://github.com/nshathish/cvtailr/blob/main/CvTailr.Api/CvTailr.Api/Data/CosmosLedgerRepository.cs): `CvTailr.Api/CvTailr.Api/Data/CosmosLedgerRepository.cs`

### Domain models

- [CV models](https://github.com/nshathish/cvtailr/blob/main/CVTailr.Shared/CVTailr.Shared/Cv/CvDocument.cs): `CVTailr.Shared/CVTailr.Shared/Cv/CvDocument.cs`
- [JD requirements](https://github.com/nshathish/cvtailr/blob/main/CVTailr.Shared/CVTailr.Shared/Jd/JdRequirements.cs): `CVTailr.Shared/CVTailr.Shared/Jd/JdRequirements.cs`
- [Job records](https://github.com/nshathish/cvtailr/blob/main/CVTailr.Shared/CVTailr.Shared/Jobs/Job.cs): `CVTailr.Shared/CVTailr.Shared/Jobs/Job.cs`

### Other components

- **User**
- **Cosmos DB**
- **Azure AI Foundry**
- **Firecrawl**

## Connections

- User → Web app: uses
- Web app → Workflow state: maintains state
- CV client → CV endpoints: calls CV routes
- JD client → JD endpoints: calls JD routes
- Jobs client → Job endpoints: calls job routes
- Scoring client → Scoring endpoints: calls scoring routes
- Tailoring client → Tailoring endpoints: calls tailoring routes
- CV endpoints → CV parsing: parses CV
- JD endpoints → JD parsing: parses JD
- JD parsing → JD source resolver: resolves source
- JD source resolver → Firecrawl: fetches source
- Scoring endpoints → Match scoring: scores match
- Tailoring endpoints → Tailoring service: proposes or applies
- Ledger endpoints → Preparation ledger: manages evidence
- Drill endpoints → Drill service: generates and evaluates
- Tailoring service → Foundry client: requests completion
- Drill service → Foundry client: requests completion
- Foundry client → Azure AI Foundry: sends inference request
- CV endpoints → CV repository: loads or saves CV
- Job workflow → Job repository: reads and writes jobs
- Tailoring service → CV repository: loads source CV
- Tailoring service → Tailored CV repository: stores tailored CV
- Preparation ledger → Ledger repository: reads and writes entries
- Preparation ledger → Tailored CV repository: updates tailored CV
- Drill service → Ledger repository: loads drill evidence
- Drill service → CV repository: loads fallback CV
- CV repository → Cosmos DB: persists CV
- Job repository → Cosmos DB: persists jobs
- Tailored CV repository → Cosmos DB: persists tailored CV
- Ledger repository → Cosmos DB: persists ledger
