# rodrivale28/accessible_job_interview_system architecture

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

- Interactive diagram: https://gitdiagram.com/rodrivale28/accessible_job_interview_system
- Repository: https://github.com/rodrivale28/accessible_job_interview_system

## Overview

Accessible Job Interview System is a browser-based mock-interview product: users configure an interview, answer selected questions, and review scored feedback; it also supports practice, role matching, history, login/guest access, and accessibility settings. The graph separates the Next.js experience from FastAPI routes, question/evaluation logic, and persistence. Some route and UI internals were not excerpted, so those links are included only where the README or source index supports them; unsampled subsystems use their exact tree paths.

Main entry points: [`backend/app/main.py`](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/main.py) (FastAPI app), [`backend/app/repository.py`](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/repository.py) (Interview repository), [`frontend/lib/api.ts`](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/lib/api.ts) (API client), [`backend/app/api/answers.py`](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/answers.py) (Answer routes)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_frontend["Web experience"]
  node_setup_ui["Interview setup<br/>[page.tsx]"]
  node_session_ui["Live interview<br/>[page.tsx]"]
  node_results_ui["Results view<br/>[page.tsx]"]
  node_practice_ui["Practice view<br/>[page.tsx]"]
  node_history_ui["Interview history<br/>[PastInterviews.tsx]"]
  node_settings_ui["Accessibility settings<br/>[SettingsPanel.tsx]"]
  node_api_client["API client<br/>[api.ts]"]
  node_auth_client["Browser auth<br/>[supabase.ts]"]
end

subgraph group_backend_api["API and identity"]
  node_api_entry["FastAPI app<br/>[main.py]"]
  node_auth["Request identity<br/>[deps.py]"]
  node_sessions["Session routes<br/>[sessions.py]"]
  node_answers["Answer routes<br/>[answers.py]"]
  node_results["Result routes<br/>[results.py]"]
end

subgraph group_interview["Interview workflow"]
  node_question_service["Question selection"]
  node_library["Question library<br/>[questions_data.py]"]
  node_behavioral_data["Behavioral questions<br/>[behavioral_data.py]"]
  node_evaluation["Answer evaluation<br/>[evaluator.py]"]
  node_feedback["Feedback scoring<br/>[feedback_rules.py]"]
  node_keyword_eval["Keyword scoring"]
  node_repository[("Interview repository<br/>[repository.py]")]
end

subgraph group_support["Practice and personalization"]
  node_roles["Role routes<br/>[roles.py]"]
  node_practice["Practice routes<br/>[practice.py]"]
  node_history["History routes<br/>[history.py]"]
  node_settings["Settings routes<br/>[settings.py]"]
  node_role_matcher["Role matcher<br/>[role_matcher.py]"]
end

node_user(("Interviewee"))
node_supabase["Supabase services"]

node_user -->|"configures"| node_setup_ui
node_setup_ui -->|"requests setup"| node_api_client
node_api_client -->|"sends API requests"| node_api_entry
node_api_entry -->|"registers routes"| node_sessions
node_api_entry -->|"registers routes"| node_answers
node_api_entry -->|"registers routes"| node_results
node_sessions -->|"selects questions"| node_question_service
node_sessions -->|"creates sessions"| node_repository
node_question_service -->|"selects and records"| node_repository
node_repository -->|"loads questions"| node_library
node_repository -->|"loads questions"| node_behavioral_data
node_user -->|"answers questions"| node_session_ui
node_answers -->|"saves answers"| node_repository
node_answers -->|"evaluates answers"| node_evaluation
node_answers -->|"builds feedback"| node_feedback
node_results -->|"loads saved results"| node_repository
node_results -->|"builds feedback"| node_feedback
node_user -->|"reviews results"| node_results_ui
node_results_ui -->|"loads results"| node_api_client
node_api_entry -->|"uses request identity"| node_auth
node_auth -->|"verifies tokens"| node_supabase
node_auth_client -->|"authenticates users"| node_supabase
node_practice_ui -->|"requests practice"| node_api_client
node_api_entry -->|"registers routes"| node_practice
node_practice -->|"evaluates practice"| node_evaluation
node_practice -->|"scores keywords"| node_keyword_eval
node_practice -->|"reads and saves"| node_repository
node_api_entry -->|"registers routes"| node_roles
node_roles -->|"reads roles"| node_repository
node_roles -.-> node_role_matcher
node_api_entry -->|"registers routes"| node_history
node_history -->|"reads history"| node_repository
node_settings_ui -.->|"uses shared API"| node_api_client
node_api_entry -->|"registers routes"| node_settings
node_settings -->|"reads and saves"| node_repository

click node_setup_ui "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/app/setup/page.tsx"
click node_session_ui "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/app/session/%5Bid%5D/page.tsx"
click node_results_ui "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/app/results/%5Bid%5D/page.tsx"
click node_practice_ui "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/app/practice/page.tsx"
click node_history_ui "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/components/PastInterviews.tsx"
click node_settings_ui "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/components/SettingsPanel.tsx"
click node_api_client "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/lib/api.ts"
click node_auth_client "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/lib/supabase.ts"
click node_api_entry "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/main.py"
click node_auth "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/deps.py"
click node_sessions "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/sessions.py"
click node_answers "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/answers.py"
click node_results "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/results.py"
click node_roles "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/roles.py"
click node_practice "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/practice.py"
click node_history "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/history.py"
click node_settings "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/settings.py"
click node_question_service "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/services/question_service.py"
click node_library "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/question_library/questions_data.py"
click node_behavioral_data "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/question_library/behavioral_data.py"
click node_evaluation "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/evaluation/evaluator.py"
click node_feedback "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/evaluation/feedback_rules.py"
click node_keyword_eval "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/evaluation/keyword_evaluator.py"
click node_repository "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/repository.py"
click node_role_matcher "https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/services/role_matcher.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_setup_ui,node_session_ui,node_results_ui,node_practice_ui,node_history_ui,node_settings_ui,node_api_client,node_auth_client,node_user toneBlue
class node_api_entry,node_auth,node_sessions,node_answers,node_results toneAmber
class node_question_service,node_library,node_behavioral_data,node_evaluation,node_feedback,node_keyword_eval,node_repository toneMint
class node_roles,node_practice,node_history,node_settings,node_role_matcher toneRose
class node_supabase toneIndigo
```

## Components

### Web experience

- [Interview setup](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/app/setup/page.tsx): `frontend/app/setup/page.tsx`
- [Live interview](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/app/session/%5Bid%5D/page.tsx): `frontend/app/session/[id]/page.tsx`
- [Results view](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/app/results/%5Bid%5D/page.tsx): `frontend/app/results/[id]/page.tsx`
- [Practice view](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/app/practice/page.tsx): `frontend/app/practice/page.tsx`
- [Interview history](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/components/PastInterviews.tsx): `frontend/components/PastInterviews.tsx`
- [Accessibility settings](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/components/SettingsPanel.tsx): `frontend/components/SettingsPanel.tsx`
- [API client](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/lib/api.ts): `frontend/lib/api.ts`
- [Browser auth](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/frontend/lib/supabase.ts): `frontend/lib/supabase.ts`

### API and identity

- [FastAPI app](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/main.py): `backend/app/main.py`
- [Request identity](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/deps.py): `backend/app/api/deps.py`
- [Session routes](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/sessions.py): `backend/app/api/sessions.py`
- [Answer routes](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/answers.py): `backend/app/api/answers.py`
- [Result routes](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/results.py): `backend/app/api/results.py`

### Interview workflow

- [Question selection](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/services/question_service.py): `backend/app/services/question_service.py`
- [Question library](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/question_library/questions_data.py): `backend/question_library/questions_data.py`
- [Behavioral questions](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/question_library/behavioral_data.py): `backend/question_library/behavioral_data.py`
- [Answer evaluation](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/evaluation/evaluator.py): `backend/app/evaluation/evaluator.py`
- [Feedback scoring](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/evaluation/feedback_rules.py): `backend/app/evaluation/feedback_rules.py`
- [Keyword scoring](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/evaluation/keyword_evaluator.py): `backend/app/evaluation/keyword_evaluator.py`
- [Interview repository](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/repository.py): `backend/app/repository.py`

### Practice and personalization

- [Role routes](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/roles.py): `backend/app/api/roles.py`
- [Practice routes](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/practice.py): `backend/app/api/practice.py`
- [History routes](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/history.py): `backend/app/api/history.py`
- [Settings routes](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/api/settings.py): `backend/app/api/settings.py`
- [Role matcher](https://github.com/rodrivale28/accessible_job_interview_system/blob/main/backend/app/services/role_matcher.py): `backend/app/services/role_matcher.py`

### Other components

- **Interviewee**
- **Supabase services**

## Connections

- Interviewee → Interview setup: configures (evidence: `README.md`)
- Interview setup → API client: requests setup (evidence: `frontend/app/setup/page.tsx`)
- API client → FastAPI app: sends API requests (evidence: `README.md`)
- FastAPI app → Session routes: registers routes (evidence: `backend/app/main.py`)
- FastAPI app → Answer routes: registers routes (evidence: `backend/app/main.py`)
- FastAPI app → Result routes: registers routes (evidence: `backend/app/main.py`)
- Session routes → Question selection: selects questions (evidence: `backend/app/api/sessions.py`)
- Session routes → Interview repository: creates sessions (evidence: `backend/app/api/sessions.py`)
- Question selection → Interview repository: selects and records (evidence: `backend/app/services/question_service.py`)
- Interview repository → Question library: loads questions (evidence: `backend/app/repository.py`)
- Interview repository → Behavioral questions: loads questions (evidence: `backend/app/repository.py`)
- Interviewee → Live interview: answers questions (evidence: `README.md`)
- Answer routes → Interview repository: saves answers (evidence: `backend/app/api/answers.py`)
- Answer routes → Answer evaluation: evaluates answers (evidence: `backend/app/api/answers.py`)
- Answer routes → Feedback scoring: builds feedback (evidence: `backend/app/api/answers.py`)
- Result routes → Interview repository: loads saved results (evidence: `backend/app/api/results.py`)
- Result routes → Feedback scoring: builds feedback (evidence: `backend/app/api/results.py`)
- Interviewee → Results view: reviews results (evidence: `README.md`)
- Results view → API client: loads results (evidence: `frontend/app/results/[id]/page.tsx`)
- FastAPI app → Request identity: uses request identity (evidence: `backend/app/api/deps.py`)
- Request identity → Supabase services: verifies tokens (evidence: `backend/app/api/deps.py`)
- Browser auth → Supabase services: authenticates users (evidence: `frontend/lib/supabase.ts`)
- Practice view → API client: requests practice (evidence: `frontend/lib/api.ts`)
- FastAPI app → Practice routes: registers routes (evidence: `backend/app/main.py`)
- Practice routes → Answer evaluation: evaluates practice (evidence: `backend/app/api/practice.py`)
- Practice routes → Keyword scoring: scores keywords (evidence: `backend/app/api/practice.py`)
- Practice routes → Interview repository: reads and saves (evidence: `backend/app/api/practice.py`)
- FastAPI app → Role routes: registers routes (evidence: `backend/app/main.py`)
- Role routes → Interview repository: reads roles (evidence: `backend/app/api/roles.py`)
- Role routes → Role matcher (evidence: `backend/app/api/roles.py`)
- FastAPI app → History routes: registers routes (evidence: `backend/app/main.py`)
- History routes → Interview repository: reads history (evidence: `backend/app/api/history.py`)
- Accessibility settings → API client: uses shared API
- FastAPI app → Settings routes: registers routes (evidence: `backend/app/main.py`)
- Settings routes → Interview repository: reads and saves (evidence: `backend/app/api/settings.py`)
