# sathvikreddy5/career_lens architecture

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

## Overview

Career Lens combines personalized career preparation with opportunity-risk analysis. Students authenticate, set a target role and skills, receive readiness gaps and a learning roadmap, then learn and practice while progress is saved; they can also analyze and revisit job or internship risks. The React app calls an Express API, whose controllers coordinate readiness, practice, safety services and PostgreSQL access. The README documents the AI assistant and Gemini integration, but sampled source does not establish its backend call path; that connection is therefore shown as unverified.

Main entry points: [`client/src/App.jsx`](https://github.com/sathvikreddy5/career_lens/blob/main/client/src/App.jsx) (Route application), [`server/src/server.js`](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/server.js) (Express API), [`server/src/controllers/practiceController.js`](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/practiceController.js) (Practice and progress), [`client/src/services/api.js`](https://github.com/sathvikreddy5/career_lens/blob/main/client/src/services/api.js) (HTTP client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Student app"]
  node_app["Route application<br/>[App.jsx]"]
  node_authui["Sign-in state<br/>[AuthContext.jsx]"]
  node_api_client["HTTP client<br/>[api.js]"]
  node_career_ui["Career screens"]
  node_learn_ui["Learning screens<br/>[LearnSkill.jsx]"]
  node_practice_ui["Practice screens<br/>[PracticeTask.jsx]"]
  node_safety_ui["Safety and history"]
  node_ai["Career Lens AI<br/>[AIAssistant.jsx]"]
end

subgraph group_api["API and identity"]
  node_api_server["Express API<br/>[server.js]"]
  node_auth_routes["Auth endpoints<br/>[authRoutes.js]"]
  node_auth_controller["Authentication<br/>[authController.js]"]
  node_auth_guard["JWT guard<br/>[authMiddleware.js]"]
  node_profile_controller["Career profile"]
  node_db[("PostgreSQL access<br/>[prisma.js]")]
end

subgraph group_career["Career preparation"]
  node_career_routes["Career endpoints<br/>[careerRoutes.js]"]
  node_career_controller["Assessment and roadmap"]
  node_role_data["Role requirements"]
  node_readiness["Readiness calculation"]
  node_roadmap["Roadmap generation<br/>[roadmapService.js]"]
  node_learning_data["Learning resources"]
end

subgraph group_practice["Practice and progress"]
  node_practice_routes["Practice endpoints<br/>[practiceRoutes.js]"]
  node_practice_controller["Practice and progress"]
  node_practice_data["Tasks and projects"]
  node_practice_service["Practice selection<br/>[practiceService.js]"]
  node_evaluators["Task evaluators"]
end

subgraph group_safety["Opportunity safety"]
  node_opportunity_routes["Opportunity endpoints"]
  node_opportunity_controller["Opportunity analysis"]
  node_ocr["Image text extraction<br/>[ocrService.js]"]
  node_safety_service["Risk analysis"]
  node_safety_routes["Safety history endpoints<br/>[safetyRoutes.js]"]
  node_safety_controller["Safety scoring"]
  node_scoring["Risk signals and scoring<br/>[safetyScoring.js]"]
end

node_student(("Student"))
node_gemini["Gemini AI"]

node_student -->|"uses"| node_app
node_app -->|"routes to"| node_career_ui
node_app -->|"routes to"| node_learn_ui
node_app -->|"routes to"| node_practice_ui
node_app -->|"routes to"| node_safety_ui
node_app -->|"checks session"| node_authui
node_authui -->|"requests auth"| node_api_client
node_career_ui -->|"requests career data"| node_api_client
node_learn_ui -.->|"requests resources"| node_api_client
node_practice_ui -->|"requests tasks and progress"| node_api_client
node_safety_ui -->|"submits and retrieves"| node_api_client
node_api_client -->|"sends REST requests"| node_api_server
node_api_server -->|"mounts"| node_auth_routes
node_api_server -->|"mounts"| node_career_routes
node_api_server -->|"mounts"| node_practice_routes
node_api_server -->|"mounts"| node_opportunity_routes
node_api_server -->|"mounts"| node_safety_routes
node_auth_routes -->|"dispatches"| node_auth_controller
node_career_routes -->|"protects endpoints"| node_auth_guard
node_career_routes -->|"dispatches"| node_career_controller
node_practice_routes -->|"protects endpoints"| node_auth_guard
node_practice_routes -->|"dispatches"| node_practice_controller
node_opportunity_routes -->|"protects endpoints"| node_auth_guard
node_opportunity_routes -->|"dispatches"| node_opportunity_controller
node_safety_routes -->|"protects endpoints"| node_auth_guard
node_safety_routes -->|"dispatches"| node_safety_controller
node_career_controller -->|"reads and writes profiles"| node_db
node_career_controller -->|"uses requirements"| node_role_data
node_career_controller -->|"calculates gaps"| node_readiness
node_career_controller -->|"generates roadmap"| node_roadmap
node_roadmap -.->|"selects resources"| node_learning_data
node_profile_controller -.->|"stores profile"| node_db
node_practice_controller -->|"loads and saves progress"| node_db
node_practice_controller -->|"selects skill gaps"| node_readiness
node_practice_controller -->|"selects practice"| node_practice_service
node_practice_controller -->|"loads tasks"| node_practice_data
node_practice_controller -->|"dispatches task evaluation"| node_evaluators
node_opportunity_controller -->|"extracts image text"| node_ocr
node_opportunity_controller -->|"analyzes submission"| node_safety_service
node_opportunity_controller -->|"stores analysis and history"| node_db
node_safety_controller -->|"scores posting"| node_scoring
node_safety_controller -->|"loads prior postings"| node_db
node_safety_controller -->|"stores safety result"| node_db
node_app -->|"renders assistant"| node_ai
node_ai -.->|"may request AI guidance"| node_gemini

click node_app "https://github.com/sathvikreddy5/career_lens/blob/main/client/src/App.jsx"
click node_authui "https://github.com/sathvikreddy5/career_lens/blob/main/client/src/context/AuthContext.jsx"
click node_api_client "https://github.com/sathvikreddy5/career_lens/blob/main/client/src/services/api.js"
click node_career_ui "https://github.com/sathvikreddy5/career_lens/blob/main/client/src/pages/CareerReadiness.jsx"
click node_learn_ui "https://github.com/sathvikreddy5/career_lens/blob/main/client/src/pages/LearnSkill.jsx"
click node_practice_ui "https://github.com/sathvikreddy5/career_lens/blob/main/client/src/pages/PracticeTask.jsx"
click node_safety_ui "https://github.com/sathvikreddy5/career_lens/blob/main/client/src/pages/OpportunitySafety.jsx"
click node_api_server "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/server.js"
click node_auth_routes "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/routes/authRoutes.js"
click node_auth_controller "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/authController.js"
click node_auth_guard "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/middleware/authMiddleware.js"
click node_profile_controller "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/profileController.js"
click node_career_routes "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/routes/careerRoutes.js"
click node_career_controller "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/careerController.js"
click node_role_data "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/data/roleRequirements.js"
click node_readiness "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/careerReadinessService.js"
click node_roadmap "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/roadmapService.js"
click node_learning_data "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/data/learningResources.js"
click node_practice_routes "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/routes/practiceRoutes.js"
click node_practice_controller "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/practiceController.js"
click node_practice_data "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/data/practiceResources.js"
click node_practice_service "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/practiceService.js"
click node_evaluators "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/practiceEvaluatorService.js"
click node_db "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/config/prisma.js"
click node_opportunity_routes "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/routes/opportunityRoutes.js"
click node_opportunity_controller "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/opportunityController.js"
click node_ocr "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/ocrService.js"
click node_safety_service "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/opportunitySafetyService.js"
click node_safety_routes "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/routes/safetyRoutes.js"
click node_safety_controller "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/safetyController.js"
click node_scoring "https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/safetyScoring.js"
click node_ai "https://github.com/sathvikreddy5/career_lens/blob/main/client/src/components/auth/ai/AIAssistant.jsx"

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_app,node_authui,node_api_client,node_career_ui,node_learn_ui,node_practice_ui,node_safety_ui,node_ai toneBlue
class node_api_server,node_auth_routes,node_auth_controller,node_auth_guard,node_profile_controller,node_db toneAmber
class node_career_routes,node_career_controller,node_role_data,node_readiness,node_roadmap,node_learning_data toneMint
class node_practice_routes,node_practice_controller,node_practice_data,node_practice_service,node_evaluators toneRose
class node_opportunity_routes,node_opportunity_controller,node_ocr,node_safety_service,node_safety_routes,node_safety_controller,node_scoring,node_student,node_gemini toneIndigo
```

## Components

### Student app

- [Route application](https://github.com/sathvikreddy5/career_lens/blob/main/client/src/App.jsx): `client/src/App.jsx`
- [Sign-in state](https://github.com/sathvikreddy5/career_lens/blob/main/client/src/context/AuthContext.jsx): `client/src/context/AuthContext.jsx`
- [HTTP client](https://github.com/sathvikreddy5/career_lens/blob/main/client/src/services/api.js): `client/src/services/api.js`
- [Career screens](https://github.com/sathvikreddy5/career_lens/blob/main/client/src/pages/CareerReadiness.jsx): `client/src/pages/CareerReadiness.jsx`
- [Learning screens](https://github.com/sathvikreddy5/career_lens/blob/main/client/src/pages/LearnSkill.jsx): `client/src/pages/LearnSkill.jsx`
- [Practice screens](https://github.com/sathvikreddy5/career_lens/blob/main/client/src/pages/PracticeTask.jsx): `client/src/pages/PracticeTask.jsx`
- [Safety and history](https://github.com/sathvikreddy5/career_lens/blob/main/client/src/pages/OpportunitySafety.jsx): `client/src/pages/OpportunitySafety.jsx`
- [Career Lens AI](https://github.com/sathvikreddy5/career_lens/blob/main/client/src/components/auth/ai/AIAssistant.jsx): `client/src/components/auth/ai/AIAssistant.jsx`

### API and identity

- [Express API](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/server.js): `server/src/server.js`
- [Auth endpoints](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/routes/authRoutes.js): `server/src/routes/authRoutes.js`
- [Authentication](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/authController.js): `server/src/controllers/authController.js`
- [JWT guard](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/middleware/authMiddleware.js): `server/src/middleware/authMiddleware.js`
- [Career profile](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/profileController.js): `server/src/controllers/profileController.js`
- [PostgreSQL access](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/config/prisma.js): `server/src/config/prisma.js`

### Career preparation

- [Career endpoints](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/routes/careerRoutes.js): `server/src/routes/careerRoutes.js`
- [Assessment and roadmap](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/careerController.js): `server/src/controllers/careerController.js`
- [Role requirements](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/data/roleRequirements.js): `server/src/data/roleRequirements.js`
- [Readiness calculation](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/careerReadinessService.js): `server/src/services/careerReadinessService.js`
- [Roadmap generation](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/roadmapService.js): `server/src/services/roadmapService.js`
- [Learning resources](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/data/learningResources.js): `server/src/data/learningResources.js`

### Practice and progress

- [Practice endpoints](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/routes/practiceRoutes.js): `server/src/routes/practiceRoutes.js`
- [Practice and progress](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/practiceController.js): `server/src/controllers/practiceController.js`
- [Tasks and projects](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/data/practiceResources.js): `server/src/data/practiceResources.js`
- [Practice selection](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/practiceService.js): `server/src/services/practiceService.js`
- [Task evaluators](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/practiceEvaluatorService.js): `server/src/services/practiceEvaluatorService.js`

### Opportunity safety

- [Opportunity endpoints](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/routes/opportunityRoutes.js): `server/src/routes/opportunityRoutes.js`
- [Opportunity analysis](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/opportunityController.js): `server/src/controllers/opportunityController.js`
- [Image text extraction](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/ocrService.js): `server/src/services/ocrService.js`
- [Risk analysis](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/opportunitySafetyService.js): `server/src/services/opportunitySafetyService.js`
- [Safety history endpoints](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/routes/safetyRoutes.js): `server/src/routes/safetyRoutes.js`
- [Safety scoring](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/controllers/safetyController.js): `server/src/controllers/safetyController.js`
- [Risk signals and scoring](https://github.com/sathvikreddy5/career_lens/blob/main/server/src/services/safetyScoring.js): `server/src/services/safetyScoring.js`

### Other components

- **Student**
- **Gemini AI**

## Connections

- Student → Route application: uses (evidence: `client/src/App.jsx`)
- Route application → Career screens: routes to (evidence: `client/src/App.jsx`)
- Route application → Learning screens: routes to (evidence: `client/src/App.jsx`)
- Route application → Practice screens: routes to (evidence: `client/src/App.jsx`)
- Route application → Safety and history: routes to (evidence: `client/src/App.jsx`)
- Route application → Sign-in state: checks session (evidence: `client/src/App.jsx`)
- Sign-in state → HTTP client: requests auth (evidence: `client/src/context/AuthContext.jsx`)
- Career screens → HTTP client: requests career data (evidence: `client/src/pages/CareerReadiness.jsx`)
- Learning screens → HTTP client: requests resources
- Practice screens → HTTP client: requests tasks and progress (evidence: `client/src/pages/PracticeTask.jsx`)
- Safety and history → HTTP client: submits and retrieves (evidence: `client/src/pages/OpportunitySafety.jsx`)
- HTTP client → Express API: sends REST requests
- Express API → Auth endpoints: mounts (evidence: `server/src/server.js`)
- Express API → Career endpoints: mounts (evidence: `server/src/server.js`)
- Express API → Practice endpoints: mounts (evidence: `server/src/server.js`)
- Express API → Opportunity endpoints: mounts (evidence: `server/src/server.js`)
- Express API → Safety history endpoints: mounts (evidence: `server/src/server.js`)
- Auth endpoints → Authentication: dispatches (evidence: `server/src/routes/authRoutes.js`)
- Career endpoints → JWT guard: protects endpoints (evidence: `server/src/routes/careerRoutes.js`)
- Career endpoints → Assessment and roadmap: dispatches (evidence: `server/src/routes/careerRoutes.js`)
- Practice endpoints → JWT guard: protects endpoints (evidence: `server/src/routes/practiceRoutes.js`)
- Practice endpoints → Practice and progress: dispatches (evidence: `server/src/routes/practiceRoutes.js`)
- Opportunity endpoints → JWT guard: protects endpoints (evidence: `server/src/routes/opportunityRoutes.js`)
- Opportunity endpoints → Opportunity analysis: dispatches (evidence: `server/src/routes/opportunityRoutes.js`)
- Safety history endpoints → JWT guard: protects endpoints (evidence: `server/src/routes/safetyRoutes.js`)
- Safety history endpoints → Safety scoring: dispatches (evidence: `server/src/routes/safetyRoutes.js`)
- Assessment and roadmap → PostgreSQL access: reads and writes profiles (evidence: `server/src/controllers/careerController.js`)
- Assessment and roadmap → Role requirements: uses requirements (evidence: `server/src/controllers/careerController.js`)
- Assessment and roadmap → Readiness calculation: calculates gaps (evidence: `server/src/controllers/careerController.js`)
- Assessment and roadmap → Roadmap generation: generates roadmap (evidence: `server/src/controllers/careerController.js`)
- Roadmap generation → Learning resources: selects resources
- Career profile → PostgreSQL access: stores profile
- Practice and progress → PostgreSQL access: loads and saves progress (evidence: `server/src/controllers/practiceController.js`)
- Practice and progress → Readiness calculation: selects skill gaps (evidence: `server/src/controllers/practiceController.js`)
- Practice and progress → Practice selection: selects practice (evidence: `server/src/controllers/practiceController.js`)
- Practice and progress → Tasks and projects: loads tasks (evidence: `server/src/controllers/practiceController.js`)
- Practice and progress → Task evaluators: dispatches task evaluation (evidence: `server/src/controllers/practiceController.js`)
- Opportunity analysis → Image text extraction: extracts image text (evidence: `server/src/controllers/opportunityController.js`)
- Opportunity analysis → Risk analysis: analyzes submission (evidence: `server/src/controllers/opportunityController.js`)
- Opportunity analysis → PostgreSQL access: stores analysis and history (evidence: `server/src/controllers/opportunityController.js`)
- Safety scoring → Risk signals and scoring: scores posting (evidence: `server/src/controllers/safetyController.js`)
- Safety scoring → PostgreSQL access: loads prior postings (evidence: `server/src/controllers/safetyController.js`)
- Safety scoring → PostgreSQL access: stores safety result (evidence: `server/src/controllers/safetyController.js`)
- Route application → Career Lens AI: renders assistant (evidence: `client/src/App.jsx`)
- Career Lens AI → Gemini AI: may request AI guidance
