# stanleyyoga123/jev-screening architecture

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

- Interactive diagram: https://gitdiagram.com/stanleyyoga123/jev-screening
- Repository: https://github.com/stanleyyoga123/jev-screening

## Overview

Jev Screening Workspace supports a user-driven resume-review workflow: extract or paste resume text, prepare or generate editable criteria, submit both to screening, and inspect per-question outcomes and confidence. The graph includes the documented validation and prompt endpoints as well as the frontend’s result presentation. Edges reflect README statements or shown calls/import references; several internals are unsampled, so uncertain relationships are omitted.

Main entry points: [`apps/web/src/App.tsx`](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/web/src/App.tsx) (Workspace UI), [`apps/api/api/router.py`](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/api/router.py) (API router), [`apps/api/domains/criteria/router.py`](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/criteria/router.py) (Criteria routes), [`apps/api/domains/criteria/service.py`](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/criteria/service.py) (Criteria generation)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_web["Review workspace"]
  node_workspace["Workspace UI<br/>[App.tsx]"]
  node_api_client["API client<br/>[api.ts]"]
  node_result_view["Result summary<br/>[results.ts]"]
  node_question_prompt["Prompt helper<br/>[QuestionPrompt.tsx]"]
end

subgraph group_api["API routing"]
  node_api_app["FastAPI app<br/>[application.py]"]
  node_api_routes["API router<br/>[router.py]"]
  node_health_routes["Health endpoint<br/>[router.py]"]
end

subgraph group_criteria["Criteria workflow"]
  node_criteria_routes["Criteria routes<br/>[router.py]"]
  node_criteria_service["Criteria generation<br/>[service.py]"]
  node_criteria_prompt["Generation prompt<br/>[prompt.py]"]
  node_criteria_model["Criteria models<br/>[model.py]"]
  node_criteria_schema["Criteria schemas<br/>[schema.py]"]
end

subgraph group_resume["Resume and screening"]
  node_documents_routes["PDF parse route<br/>[router.py]"]
  node_documents_service["PDF extraction<br/>[service.py]"]
  node_pdf_reader["PDF reader<br/>[reader.py]"]
  node_screen_routes["Screening route<br/>[router.py]"]
  node_screen_service["Resume evaluation<br/>[service.py]"]
  node_screen_schema["Screening schemas<br/>[schema.py]"]
  node_screen_model["Screening models<br/>[model.py]"]
end

subgraph group_providers["External providers"]
  node_generator["Question generator<br/>[generator.py]"]
  node_jev_provider["Jev provider<br/>[jev.py]"]
end

node_reviewer(("Reviewer"))
node_openrouter["OpenRouter"]

node_reviewer -->|"edits inputs"| node_workspace
node_workspace -->|"sends requests"| node_api_client
node_workspace -->|"renders prompt"| node_question_prompt
node_workspace -->|"summarizes results"| node_result_view
node_api_client -->|"calls API"| node_api_app
node_api_app -->|"mounts routes"| node_api_routes
node_api_routes -->|"dispatches"| node_criteria_routes
node_api_routes -->|"dispatches"| node_documents_routes
node_api_routes -->|"dispatches"| node_screen_routes
node_api_routes -->|"dispatches"| node_health_routes
node_criteria_routes -->|"invokes generation"| node_criteria_service
node_criteria_routes -->|"returns prompt"| node_criteria_prompt
node_criteria_service -->|"uses prompt"| node_criteria_prompt
node_criteria_service -->|"validates output"| node_criteria_model
node_criteria_routes -->|"accepts responses"| node_criteria_schema
node_criteria_service -->|"requests generation"| node_generator
node_generator -.->|"calls provider"| node_openrouter
node_workspace -->|"uploads PDF"| node_documents_routes
node_documents_routes -->|"parses content"| node_documents_service
node_documents_service -->|"extracts text"| node_pdf_reader
node_workspace -->|"generates criteria"| node_criteria_routes
node_workspace -->|"submits resume/questions"| node_screen_routes
node_screen_routes -->|"invokes screening"| node_screen_service
node_screen_service -->|"evaluates request"| node_jev_provider
node_jev_provider -->|"calls provider"| node_openrouter
node_screen_routes -->|"uses schemas"| node_screen_schema
node_screen_service -->|"accepts request"| node_screen_schema
node_screen_service -->|"maps errors"| node_screen_model

click node_workspace "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/web/src/App.tsx"
click node_api_client "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/web/src/api.ts"
click node_result_view "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/web/src/results.ts"
click node_question_prompt "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/web/src/QuestionPrompt.tsx"
click node_api_app "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/api/application.py"
click node_api_routes "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/api/router.py"
click node_criteria_routes "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/criteria/router.py"
click node_criteria_service "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/criteria/service.py"
click node_criteria_prompt "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/criteria/prompt.py"
click node_criteria_model "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/criteria/model.py"
click node_criteria_schema "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/criteria/schema.py"
click node_generator "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/integrations/generator.py"
click node_documents_routes "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/documents/router.py"
click node_documents_service "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/documents/service.py"
click node_pdf_reader "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/integrations/reader.py"
click node_screen_routes "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/screening/router.py"
click node_screen_service "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/screening/service.py"
click node_screen_schema "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/screening/schema.py"
click node_screen_model "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/screening/model.py"
click node_jev_provider "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/integrations/jev.py"
click node_health_routes "https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/health/router.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_workspace,node_api_client,node_result_view,node_question_prompt,node_reviewer toneBlue
class node_api_app,node_api_routes,node_health_routes toneAmber
class node_criteria_routes,node_criteria_service,node_criteria_prompt,node_criteria_model,node_criteria_schema,node_openrouter toneMint
class node_documents_routes,node_documents_service,node_pdf_reader,node_screen_routes,node_screen_service,node_screen_schema,node_screen_model toneRose
class node_generator,node_jev_provider toneIndigo
```

## Components

### Review workspace

- [Workspace UI](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/web/src/App.tsx): `apps/web/src/App.tsx`
- [API client](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/web/src/api.ts): `apps/web/src/api.ts`
- [Result summary](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/web/src/results.ts): `apps/web/src/results.ts`
- [Prompt helper](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/web/src/QuestionPrompt.tsx): `apps/web/src/QuestionPrompt.tsx`

### API routing

- [FastAPI app](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/api/application.py): `apps/api/api/application.py`
- [API router](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/api/router.py): `apps/api/api/router.py`
- [Health endpoint](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/health/router.py): `apps/api/domains/health/router.py`

### Criteria workflow

- [Criteria routes](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/criteria/router.py): `apps/api/domains/criteria/router.py`
- [Criteria generation](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/criteria/service.py): `apps/api/domains/criteria/service.py`
- [Generation prompt](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/criteria/prompt.py): `apps/api/domains/criteria/prompt.py`
- [Criteria models](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/criteria/model.py): `apps/api/domains/criteria/model.py`
- [Criteria schemas](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/criteria/schema.py): `apps/api/domains/criteria/schema.py`

### Resume and screening

- [PDF parse route](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/documents/router.py): `apps/api/domains/documents/router.py`
- [PDF extraction](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/documents/service.py): `apps/api/domains/documents/service.py`
- [PDF reader](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/integrations/reader.py): `apps/api/integrations/reader.py`
- [Screening route](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/screening/router.py): `apps/api/domains/screening/router.py`
- [Resume evaluation](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/screening/service.py): `apps/api/domains/screening/service.py`
- [Screening schemas](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/screening/schema.py): `apps/api/domains/screening/schema.py`
- [Screening models](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/domains/screening/model.py): `apps/api/domains/screening/model.py`

### External providers

- [Question generator](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/integrations/generator.py): `apps/api/integrations/generator.py`
- [Jev provider](https://github.com/stanleyyoga123/jev-screening/blob/main/apps/api/integrations/jev.py): `apps/api/integrations/jev.py`

### Other components

- **Reviewer**
- **OpenRouter**

## Connections

- Reviewer → Workspace UI: edits inputs (evidence: `README.md`)
- Workspace UI → API client: sends requests (evidence: `apps/web/src/App.tsx`)
- Workspace UI → Prompt helper: renders prompt (evidence: `apps/web/src/App.tsx`)
- Workspace UI → Result summary: summarizes results (evidence: `apps/web/src/App.tsx`)
- API client → FastAPI app: calls API (evidence: `README.md`)
- FastAPI app → API router: mounts routes (evidence: `apps/api/api/application.py`)
- API router → Criteria routes: dispatches (evidence: `apps/api/api/router.py`)
- API router → PDF parse route: dispatches (evidence: `apps/api/api/router.py`)
- API router → Screening route: dispatches (evidence: `apps/api/api/router.py`)
- API router → Health endpoint: dispatches (evidence: `apps/api/api/router.py`)
- Criteria routes → Criteria generation: invokes generation (evidence: `apps/api/domains/criteria/router.py`)
- Criteria routes → Generation prompt: returns prompt (evidence: `apps/api/domains/criteria/router.py`)
- Criteria generation → Generation prompt: uses prompt (evidence: `apps/api/domains/criteria/service.py`)
- Criteria generation → Criteria models: validates output (evidence: `apps/api/domains/criteria/service.py`)
- Criteria routes → Criteria schemas: accepts responses (evidence: `apps/api/domains/criteria/router.py`)
- Criteria generation → Question generator: requests generation (evidence: `apps/api/domains/criteria/service.py`)
- Question generator → OpenRouter: calls provider
- Workspace UI → PDF parse route: uploads PDF (evidence: `README.md`)
- PDF parse route → PDF extraction: parses content (evidence: `apps/api/domains/documents/router.py`)
- PDF extraction → PDF reader: extracts text (evidence: `apps/api/domains/documents/service.py`)
- Workspace UI → Criteria routes: generates criteria (evidence: `README.md`)
- Workspace UI → Screening route: submits resume/questions (evidence: `apps/web/src/App.tsx`)
- Screening route → Resume evaluation: invokes screening (evidence: `apps/api/domains/screening/router.py`)
- Resume evaluation → Jev provider: evaluates request (evidence: `apps/api/domains/screening/service.py`)
- Jev provider → OpenRouter: calls provider (evidence: `README.md`)
- Screening route → Screening schemas: uses schemas (evidence: `apps/api/domains/screening/router.py`)
- Resume evaluation → Screening schemas: accepts request (evidence: `apps/api/domains/screening/service.py`)
- Resume evaluation → Screening models: maps errors (evidence: `apps/api/domains/screening/service.py`)
