# ishurana001/ai-interviewer-ongoing architecture

> Architecture diagram of the GitHub repository ishurana001/ai-interviewer-ongoing, 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/ishurana001/ai-interviewer-ongoing
- Repository: https://github.com/ishurana001/ai-interviewer-ongoing

## Overview

AI Mock Interviewer guides a candidate from signing in and preparing a resume or job description to generating and saving a practice interview, then opening the session. The sampled creation flow uploads resumes through ImageKit and delegates question generation to an n8n webhook; Convex stores interview sessions. The README also describes interactive follow-ups, scorecards, and actionable feedback, but their implementation was not sampled, so those capabilities are shown at the interview area without inferred internal wiring. Authentication and rate limiting are represented where evidenced.

Main entry points: [`app/(routes)/_components/CreateInterviewDialog.tsx`](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/_components/CreateInterviewDialog.tsx) (Interview setup), [`app/api/generate-interview-questions/route.tsx`](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/api/generate-interview-questions/route.tsx) (Question generation API), [`app/(routes)/interview/[interviewId]/page.tsx`](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/interview/%5BinterviewId%5D/page.tsx) (Interview session), [`convex/Interview.ts`](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/convex/Interview.ts) (Interview functions)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_experience["Candidate experience"]
  node_auth_pages["Sign-in / sign-up"]
  node_dashboard["Dashboard<br/>[page.tsx]"]
  node_create_dialog["Interview setup"]
  node_resume_form["Resume upload form<br/>[ResumeUpload.tsx]"]
  node_job_form["Job description form<br/>[JobDescription.tsx]"]
  node_interview_page["Interview session<br/>[page.tsx]"]
  node_interview_start["Start interview<br/>[page.tsx]"]
  node_interview_capabilities["Follow-ups and feedback"]
end

subgraph group_generation["Interview generation"]
  node_generation_api["Question generation API<br/>[route.tsx]"]
  node_arcjet_config["Rate-limit configuration<br/>[arcjet.ts]"]
end

subgraph group_persistence["Identity and persistence"]
  node_interview_functions["Interview functions<br/>[Interview.ts]"]
  node_users_functions["User functions<br/>[users.ts]"]
  node_schema["Data schema<br/>[schema.ts]"]
  node_database[("Convex database")]
end

subgraph group_integrations["External services"]
  node_auth_provider["Clerk authentication"]
  node_imagekit["ImageKit storage"]
  node_n8n["n8n workflow"]
  node_openai["OpenAI model"]
  node_arcjet["Arcjet service"]
end

node_candidate(("Candidate"))

node_candidate -->|"signs in"| node_auth_pages
node_auth_pages -->|"authenticates with"| node_auth_provider
node_candidate -->|"opens"| node_dashboard
node_dashboard -->|"starts setup"| node_create_dialog
node_create_dialog -->|"collects resume"| node_resume_form
node_create_dialog -->|"collects role details"| node_job_form
node_create_dialog -->|"submits inputs"| node_generation_api
node_generation_api -->|"gets current user"| node_auth_provider
node_generation_api -->|"applies limits"| node_arcjet_config
node_arcjet_config -->|"checks quota"| node_arcjet
node_generation_api -->|"uploads resume"| node_imagekit
node_generation_api -->|"requests questions"| node_n8n
node_n8n -.->|"generates questions"| node_openai
node_generation_api -->|"returns questions"| node_create_dialog
node_create_dialog -->|"saves session"| node_interview_functions
node_interview_functions -->|"reads and writes"| node_database
node_users_functions -->|"reads and writes"| node_database
node_schema -->|"defines tables"| node_database
node_create_dialog -->|"navigates to session"| node_interview_page
node_interview_page -->|"loads session"| node_interview_functions
node_interview_page -->|"opens start flow"| node_interview_start
node_interview_page -.->|"provides practice and review"| node_interview_capabilities
node_interview_capabilities -.->|"automation workflows"| node_n8n

click node_auth_pages "https://github.com/ishurana001/ai-interviewer-ongoing/tree/main/app/(auth)"
click node_dashboard "https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/dashboard/page.tsx"
click node_create_dialog "https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/_components/CreateInterviewDialog.tsx"
click node_resume_form "https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/_components/ResumeUpload.tsx"
click node_job_form "https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/_components/JobDescription.tsx"
click node_interview_page "https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/interview/%5BinterviewId%5D/page.tsx"
click node_interview_start "https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/interview/%5BinterviewId%5D/start/page.tsx"
click node_interview_capabilities "https://github.com/ishurana001/ai-interviewer-ongoing/tree/main/app/(routes)/interview/%5BinterviewId%5D"
click node_generation_api "https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/api/generate-interview-questions/route.tsx"
click node_arcjet_config "https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/utils/arcjet.ts"
click node_interview_functions "https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/convex/Interview.ts"
click node_users_functions "https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/convex/users.ts"
click node_schema "https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/convex/schema.ts"

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_auth_pages,node_dashboard,node_create_dialog,node_resume_form,node_job_form,node_interview_page,node_interview_start,node_interview_capabilities toneBlue
class node_generation_api,node_arcjet_config toneAmber
class node_interview_functions,node_users_functions,node_schema,node_database toneMint
class node_auth_provider,node_imagekit,node_n8n,node_openai,node_arcjet toneRose
class node_candidate toneIndigo
```

## Components

### Candidate experience

- [Sign-in / sign-up](https://github.com/ishurana001/ai-interviewer-ongoing/tree/main/app/(auth)): `app/(auth)`
- [Dashboard](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/dashboard/page.tsx): `app/(routes)/dashboard/page.tsx`
- [Interview setup](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/_components/CreateInterviewDialog.tsx): `app/(routes)/_components/CreateInterviewDialog.tsx`
- [Resume upload form](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/_components/ResumeUpload.tsx): `app/(routes)/_components/ResumeUpload.tsx`
- [Job description form](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/_components/JobDescription.tsx): `app/(routes)/_components/JobDescription.tsx`
- [Interview session](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/interview/%5BinterviewId%5D/page.tsx): `app/(routes)/interview/[interviewId]/page.tsx`
- [Start interview](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/(routes)/interview/%5BinterviewId%5D/start/page.tsx): `app/(routes)/interview/[interviewId]/start/page.tsx`
- [Follow-ups and feedback](https://github.com/ishurana001/ai-interviewer-ongoing/tree/main/app/(routes)/interview/%5BinterviewId%5D): `app/(routes)/interview/[interviewId]`

### Interview generation

- [Question generation API](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/app/api/generate-interview-questions/route.tsx): `app/api/generate-interview-questions/route.tsx`
- [Rate-limit configuration](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/utils/arcjet.ts): `utils/arcjet.ts`

### Identity and persistence

- [Interview functions](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/convex/Interview.ts): `convex/Interview.ts`
- [User functions](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/convex/users.ts): `convex/users.ts`
- [Data schema](https://github.com/ishurana001/ai-interviewer-ongoing/blob/main/convex/schema.ts): `convex/schema.ts`
- **Convex database**

### External services

- **Clerk authentication**
- **ImageKit storage**
- **n8n workflow**
- **OpenAI model**
- **Arcjet service**

### Other components

- **Candidate**

## Connections

- Candidate → Sign-in / sign-up: signs in
- Sign-in / sign-up → Clerk authentication: authenticates with
- Candidate → Dashboard: opens
- Dashboard → Interview setup: starts setup
- Interview setup → Resume upload form: collects resume
- Interview setup → Job description form: collects role details
- Interview setup → Question generation API: submits inputs
- Question generation API → Clerk authentication: gets current user
- Question generation API → Rate-limit configuration: applies limits
- Rate-limit configuration → Arcjet service: checks quota
- Question generation API → ImageKit storage: uploads resume
- Question generation API → n8n workflow: requests questions
- n8n workflow → OpenAI model: generates questions
- Question generation API → Interview setup: returns questions
- Interview setup → Interview functions: saves session
- Interview functions → Convex database: reads and writes
- User functions → Convex database: reads and writes
- Data schema → Convex database: defines tables
- Interview setup → Interview session: navigates to session
- Interview session → Interview functions: loads session
- Interview session → Start interview: opens start flow
- Interview session → Follow-ups and feedback: provides practice and review
- Follow-ups and feedback → n8n workflow: automation workflows
