# tejxs18/peerprep architecture

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

- Interactive diagram: https://gitdiagram.com/tejxs18/peerprep
- Repository: https://github.com/tejxs18/peerprep

## Overview

PeerPrep supports two practice paths: authenticated peer rooms for collaborative coding, chat, and video, and AI-led interview sessions with persistent questions, code reviews, follow-ups, and Q&A. The graph also preserves code execution and lobby presence as distinct capabilities. Controller, route, client-service, and execution wiring is supported by sampled source; README-described room/editor details and unsampled AI-agent internals are represented at their documented module paths, with uncertain call links omitted.

Main entry points: [`server/index.js`](https://github.com/tejxs18/peerprep/blob/main/server/index.js) (Express API), [`client/src/App.jsx`](https://github.com/tejxs18/peerprep/blob/main/client/src/App.jsx) (Routed app), [`client/src/pages/Room/Room.jsx`](https://github.com/tejxs18/peerprep/blob/main/client/src/pages/Room/Room.jsx) (Collaborative room), [`client/src/pages/InterviewRoom/InterviewRoom.jsx`](https://github.com/tejxs18/peerprep/blob/main/client/src/pages/InterviewRoom/InterviewRoom.jsx) (Interview workspace)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Client experience"]
  node_app["Routed app<br/>[App.jsx]"]
  node_authui["Login / register<br/>[Login.jsx]"]
  node_authctx["Auth state<br/>[AuthContext.jsx]"]
  node_lobby["Lobby<br/>[Lobby.jsx]"]
  node_room["Collaborative room<br/>[Room.jsx]"]
  node_editor["Code editor<br/>[CodeEditor.jsx]"]
  node_video["Video controls"]
  node_interviewui["Interview workspace<br/>[InterviewRoom.jsx]"]
  node_questionui["Question and difficulty<br/>[QuestionPanel.jsx]"]
  node_feedbackui["Review and follow-ups<br/>[FeedbackPanel.jsx]"]
end

subgraph group_api["API and identity"]
  node_server["Express API<br/>[index.js]"]
  node_authroutes["Auth routes<br/>[authRoutes.js]"]
  node_authcontroller["Auth handlers<br/>[authController.js]"]
  node_middleware["JWT middleware<br/>[auth.js]"]
end

subgraph group_practice["Practice services"]
  node_interviewsvc["Interview API client"]
  node_lobbysvc["Lobby presence client"]
  node_streamsvc["Room chat client<br/>[streamService.js]"]
  node_videosvc["Video client"]
  node_executeroutes["Code execution<br/>[executeRoutes.js]"]
end

subgraph group_ai["AI interview"]
  node_interviewroutes["Interview routes<br/>[interviewRoutes.js]"]
  node_interviewcontroller["Interview orchestration"]
  node_runner["Agent runner<br/>[agentRunner.mjs]"]
  node_interviewer["Interviewer agent"]
  node_reviewer["Code reviewer agent"]
  node_followup["Follow-up agent<br/>[followupAgent.mjs]"]
  node_geminicli["Gemini client<br/>[geminiClient.mjs]"]
end

subgraph group_state["Persistence and cloud"]
  node_interviewmodel[("Interview sessions<br/>[Interview.js]")]
  node_usermodel[("User records<br/>[User.js]")]
  node_mongo[("MongoDB")]
  node_streamcloud["GetStream"]
  node_gemini["Gemini API"]
  node_runtime["Language runtimes"]
end

node_user(("Participant"))

node_user -->|"uses"| node_app
node_app -->|"provides auth"| node_authctx
node_app -->|"routes"| node_authui
node_app -->|"routes"| node_lobby
node_app -->|"routes"| node_room
node_app -->|"routes"| node_interviewui
node_authui -->|"auth requests"| node_server
node_authctx -->|"auth requests"| node_server
node_server -->|"dispatches"| node_authroutes
node_authroutes -->|"calls"| node_authcontroller
node_authcontroller -->|"reads / writes"| node_usermodel
node_usermodel -->|"persists"| node_mongo
node_lobby -->|"uses"| node_lobbysvc
node_lobbysvc -->|"gets token"| node_streamsvc
node_lobbysvc -->|"lobby requests"| node_server
node_lobbysvc -->|"presence events"| node_streamcloud
node_room -->|"edits code"| node_editor
node_room -->|"uses"| node_streamsvc
node_room -->|"uses"| node_videosvc
node_videosvc -->|"video calls"| node_streamcloud
node_streamsvc -->|"chat and sync"| node_streamcloud
node_room -->|"execute request"| node_server
node_server -->|"dispatches"| node_executeroutes
node_executeroutes -->|"spawns code"| node_runtime
node_interviewui -->|"shows prompts"| node_questionui
node_interviewui -->|"shows results"| node_feedbackui
node_interviewui -->|"requests sessions"| node_interviewsvc
node_interviewsvc -->|"interview requests"| node_server
node_server -->|"dispatches"| node_interviewroutes
node_interviewroutes -->|"guards routes"| node_middleware
node_interviewroutes -->|"dispatches"| node_interviewcontroller
node_interviewcontroller -->|"reads / writes"| node_interviewmodel
node_interviewmodel -->|"persists"| node_mongo
node_interviewcontroller -->|"loads and calls"| node_runner
node_runner -->|"dispatches"| node_interviewer
node_runner -->|"dispatches"| node_reviewer
node_runner -->|"dispatches"| node_followup
node_interviewer -->|"generates with"| node_geminicli
node_reviewer -->|"reviews with"| node_geminicli
node_followup -->|"generates with"| node_geminicli
node_geminicli -->|"generates content"| node_gemini
node_authroutes -->|"tokens and channels"| node_streamcloud

click node_app "https://github.com/tejxs18/peerprep/blob/main/client/src/App.jsx"
click node_authui "https://github.com/tejxs18/peerprep/blob/main/client/src/pages/Authentication/Login.jsx"
click node_authctx "https://github.com/tejxs18/peerprep/blob/main/client/src/context/AuthContext.jsx"
click node_lobby "https://github.com/tejxs18/peerprep/blob/main/client/src/pages/Lobby/Lobby.jsx"
click node_room "https://github.com/tejxs18/peerprep/blob/main/client/src/pages/Room/Room.jsx"
click node_editor "https://github.com/tejxs18/peerprep/blob/main/client/src/components/CodeEditor.jsx"
click node_video "https://github.com/tejxs18/peerprep/blob/main/client/src/components/RoomVideoControls.jsx"
click node_interviewui "https://github.com/tejxs18/peerprep/blob/main/client/src/pages/InterviewRoom/InterviewRoom.jsx"
click node_questionui "https://github.com/tejxs18/peerprep/blob/main/client/src/components/ai/QuestionPanel.jsx"
click node_feedbackui "https://github.com/tejxs18/peerprep/blob/main/client/src/components/ai/FeedbackPanel.jsx"
click node_interviewsvc "https://github.com/tejxs18/peerprep/blob/main/client/src/services/interviewService.js"
click node_lobbysvc "https://github.com/tejxs18/peerprep/blob/main/client/src/services/lobbyStreamService.js"
click node_streamsvc "https://github.com/tejxs18/peerprep/blob/main/client/src/services/streamService.js"
click node_videosvc "https://github.com/tejxs18/peerprep/blob/main/client/src/services/streamVideoService.js"
click node_server "https://github.com/tejxs18/peerprep/blob/main/server/index.js"
click node_authroutes "https://github.com/tejxs18/peerprep/blob/main/server/routes/authRoutes.js"
click node_authcontroller "https://github.com/tejxs18/peerprep/blob/main/server/controllers/authController.js"
click node_middleware "https://github.com/tejxs18/peerprep/blob/main/server/middleware/auth.js"
click node_executeroutes "https://github.com/tejxs18/peerprep/blob/main/server/routes/executeRoutes.js"
click node_interviewroutes "https://github.com/tejxs18/peerprep/blob/main/server/routes/interviewRoutes.js"
click node_interviewcontroller "https://github.com/tejxs18/peerprep/blob/main/server/controllers/interviewController.js"
click node_runner "https://github.com/tejxs18/peerprep/blob/main/server/agents/agentRunner.mjs"
click node_interviewer "https://github.com/tejxs18/peerprep/blob/main/server/agents/interviewerAgent.mjs"
click node_reviewer "https://github.com/tejxs18/peerprep/blob/main/server/agents/codeReviewerAgent.mjs"
click node_followup "https://github.com/tejxs18/peerprep/blob/main/server/agents/followupAgent.mjs"
click node_geminicli "https://github.com/tejxs18/peerprep/blob/main/server/agents/geminiClient.mjs"
click node_interviewmodel "https://github.com/tejxs18/peerprep/blob/main/server/models/Interview.js"
click node_usermodel "https://github.com/tejxs18/peerprep/blob/main/server/models/User.js"

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_authctx,node_lobby,node_room,node_editor,node_video,node_interviewui,node_questionui,node_feedbackui toneBlue
class node_server,node_authroutes,node_authcontroller,node_middleware toneAmber
class node_interviewsvc,node_lobbysvc,node_streamsvc,node_videosvc,node_executeroutes toneMint
class node_interviewroutes,node_interviewcontroller,node_runner,node_interviewer,node_reviewer,node_followup,node_geminicli toneRose
class node_interviewmodel,node_usermodel,node_mongo,node_streamcloud,node_gemini,node_runtime,node_user toneIndigo
```

## Components

### Client experience

- [Routed app](https://github.com/tejxs18/peerprep/blob/main/client/src/App.jsx): `client/src/App.jsx`
- [Login / register](https://github.com/tejxs18/peerprep/blob/main/client/src/pages/Authentication/Login.jsx): `client/src/pages/Authentication/Login.jsx`
- [Auth state](https://github.com/tejxs18/peerprep/blob/main/client/src/context/AuthContext.jsx): `client/src/context/AuthContext.jsx`
- [Lobby](https://github.com/tejxs18/peerprep/blob/main/client/src/pages/Lobby/Lobby.jsx): `client/src/pages/Lobby/Lobby.jsx`
- [Collaborative room](https://github.com/tejxs18/peerprep/blob/main/client/src/pages/Room/Room.jsx): `client/src/pages/Room/Room.jsx`
- [Code editor](https://github.com/tejxs18/peerprep/blob/main/client/src/components/CodeEditor.jsx): `client/src/components/CodeEditor.jsx`
- [Video controls](https://github.com/tejxs18/peerprep/blob/main/client/src/components/RoomVideoControls.jsx): `client/src/components/RoomVideoControls.jsx`
- [Interview workspace](https://github.com/tejxs18/peerprep/blob/main/client/src/pages/InterviewRoom/InterviewRoom.jsx): `client/src/pages/InterviewRoom/InterviewRoom.jsx`
- [Question and difficulty](https://github.com/tejxs18/peerprep/blob/main/client/src/components/ai/QuestionPanel.jsx): `client/src/components/ai/QuestionPanel.jsx`
- [Review and follow-ups](https://github.com/tejxs18/peerprep/blob/main/client/src/components/ai/FeedbackPanel.jsx): `client/src/components/ai/FeedbackPanel.jsx`

### API and identity

- [Express API](https://github.com/tejxs18/peerprep/blob/main/server/index.js): `server/index.js`
- [Auth routes](https://github.com/tejxs18/peerprep/blob/main/server/routes/authRoutes.js): `server/routes/authRoutes.js`
- [Auth handlers](https://github.com/tejxs18/peerprep/blob/main/server/controllers/authController.js): `server/controllers/authController.js`
- [JWT middleware](https://github.com/tejxs18/peerprep/blob/main/server/middleware/auth.js): `server/middleware/auth.js`

### Practice services

- [Interview API client](https://github.com/tejxs18/peerprep/blob/main/client/src/services/interviewService.js): `client/src/services/interviewService.js`
- [Lobby presence client](https://github.com/tejxs18/peerprep/blob/main/client/src/services/lobbyStreamService.js): `client/src/services/lobbyStreamService.js`
- [Room chat client](https://github.com/tejxs18/peerprep/blob/main/client/src/services/streamService.js): `client/src/services/streamService.js`
- [Video client](https://github.com/tejxs18/peerprep/blob/main/client/src/services/streamVideoService.js): `client/src/services/streamVideoService.js`
- [Code execution](https://github.com/tejxs18/peerprep/blob/main/server/routes/executeRoutes.js): `server/routes/executeRoutes.js`

### AI interview

- [Interview routes](https://github.com/tejxs18/peerprep/blob/main/server/routes/interviewRoutes.js): `server/routes/interviewRoutes.js`
- [Interview orchestration](https://github.com/tejxs18/peerprep/blob/main/server/controllers/interviewController.js): `server/controllers/interviewController.js`
- [Agent runner](https://github.com/tejxs18/peerprep/blob/main/server/agents/agentRunner.mjs): `server/agents/agentRunner.mjs`
- [Interviewer agent](https://github.com/tejxs18/peerprep/blob/main/server/agents/interviewerAgent.mjs): `server/agents/interviewerAgent.mjs`
- [Code reviewer agent](https://github.com/tejxs18/peerprep/blob/main/server/agents/codeReviewerAgent.mjs): `server/agents/codeReviewerAgent.mjs`
- [Follow-up agent](https://github.com/tejxs18/peerprep/blob/main/server/agents/followupAgent.mjs): `server/agents/followupAgent.mjs`
- [Gemini client](https://github.com/tejxs18/peerprep/blob/main/server/agents/geminiClient.mjs): `server/agents/geminiClient.mjs`

### Persistence and cloud

- [Interview sessions](https://github.com/tejxs18/peerprep/blob/main/server/models/Interview.js): `server/models/Interview.js`
- [User records](https://github.com/tejxs18/peerprep/blob/main/server/models/User.js): `server/models/User.js`
- **MongoDB**
- **GetStream**
- **Gemini API**
- **Language runtimes**

### Other components

- **Participant**

## Connections

- Participant → Routed app: uses
- Routed app → Auth state: provides auth
- Routed app → Login / register: routes
- Routed app → Lobby: routes
- Routed app → Collaborative room: routes
- Routed app → Interview workspace: routes
- Login / register → Express API: auth requests
- Auth state → Express API: auth requests
- Express API → Auth routes: dispatches
- Auth routes → Auth handlers: calls
- Auth handlers → User records: reads / writes
- User records → MongoDB: persists
- Lobby → Lobby presence client: uses
- Lobby presence client → Room chat client: gets token
- Lobby presence client → Express API: lobby requests
- Lobby presence client → GetStream: presence events
- Collaborative room → Code editor: edits code
- Collaborative room → Room chat client: uses
- Collaborative room → Video client: uses
- Video client → GetStream: video calls
- Room chat client → GetStream: chat and sync
- Collaborative room → Express API: execute request
- Express API → Code execution: dispatches
- Code execution → Language runtimes: spawns code
- Interview workspace → Question and difficulty: shows prompts
- Interview workspace → Review and follow-ups: shows results
- Interview workspace → Interview API client: requests sessions
- Interview API client → Express API: interview requests
- Express API → Interview routes: dispatches
- Interview routes → JWT middleware: guards routes
- Interview routes → Interview orchestration: dispatches
- Interview orchestration → Interview sessions: reads / writes
- Interview sessions → MongoDB: persists
- Interview orchestration → Agent runner: loads and calls
- Agent runner → Interviewer agent: dispatches
- Agent runner → Code reviewer agent: dispatches
- Agent runner → Follow-up agent: dispatches
- Interviewer agent → Gemini client: generates with
- Code reviewer agent → Gemini client: reviews with
- Follow-up agent → Gemini client: generates with
- Gemini client → Gemini API: generates content
- Auth routes → GetStream: tokens and channels
