# sankar-ayudham/ai-job-portal architecture

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

- Interactive diagram: https://gitdiagram.com/sankar-ayudham/ai-job-portal
- Repository: https://github.com/sankar-ayudham/ai-job-portal

## Overview

This is a MERN hiring portal whose main workflow runs from candidate job search and application through resume upload, ATS analysis, and recruiter review. The React app also supports registration/login, application tracking, and AI resume writing; recruiters manage listings and review ranked applicants. Express routes dispatch requests to controllers, which read and write MongoDB models, while AI analysis and cloud resume storage use external services. The graph reflects documented capabilities where implementation excerpts were unavailable; some route-to-controller wiring and client API calls are therefore represented only where supported by the tree or README.

Main entry points: [`server/server.js`](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/server.js) (Express server), [`client/src/App.jsx`](https://github.com/sankar-ayudham/ai-job-portal/blob/main/client/src/App.jsx) (React application), [`server/controllers/aiController.js`](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/aiController.js) (ATS and resume AI), [`client/src/api/axios.js`](https://github.com/sankar-ayudham/ai-job-portal/blob/main/client/src/api/axios.js) (API client)

## Diagram (Mermaid)

```mermaid
flowchart TD

subgraph group_client["Candidate and recruiter UI"]
  node_web["React application<br/>[App.jsx]"]
  node_candidate_pages["Candidate pages<br/>[Jobs.jsx]"]
  node_recruiter_pages["Recruiter pages"]
  node_resume_page["Resume builder<br/>[ResumeBuilder.jsx]"]
  node_client_api["API client<br/>[axios.js]"]
end

subgraph group_api["API and access control"]
  node_server["Express server<br/>[server.js]"]
  node_job_routes["Job routes<br/>[jobRoutes.js]"]
  node_application_routes["Application routes"]
  node_auth_routes["Auth routes<br/>[authRoutes.js]"]
  node_ai_routes["AI routes<br/>[aiRoutes.js]"]
  node_upload_routes["Upload routes<br/>[uploadRoutes.js]"]
end

subgraph group_hiring["Hiring workflows"]
  node_auth_controller["Authentication<br/>[authController.js]"]
  node_job_controller["Job search and management<br/>[jobController.js]"]
  node_application_controller["Applications"]
  node_recruiter_controller["Recruiter workflows"]
end

subgraph group_intelligence["AI and documents"]
  node_ai_controller["ATS and resume AI<br/>[aiController.js]"]
  node_upload_controller["Resume upload"]
  node_cloudinary_util["Cloud file storage<br/>[cloudinary.js]"]
end

subgraph group_data["Persistence"]
  node_mongo[("MongoDB<br/>[db.js]")]
  node_user_model[("User records<br/>[User.js]")]
  node_job_model[("Job records<br/>[Job.js]")]
  node_application_model[("Application records<br/>[Application.js]")]
  node_profile_model[("Candidate profiles<br/>[Profile.js]")]
  node_resume_model[("Resume records<br/>[Resume.js]")]
  node_saved_job_model[("Saved jobs<br/>[SavedJob.js]")]
  node_notification_model[("Notifications<br/>[Notification.js]")]
end

node_candidate(("Candidate"))
node_recruiter(("Recruiter"))
node_groq{{"Groq LLM"}}

node_candidate -->|"uses"| node_web
node_recruiter -->|"uses"| node_web
node_web -->|"routes to"| node_candidate_pages
node_web -->|"routes to"| node_recruiter_pages
node_web -->|"routes to"| node_resume_page
node_candidate_pages -->|"requests"| node_client_api
node_recruiter_pages -->|"requests"| node_client_api
node_resume_page -->|"requests"| node_client_api
node_client_api -->|"REST calls"| node_server
node_server -->|"mounts"| node_job_routes
node_server -->|"mounts"| node_application_routes
node_server -->|"mounts"| node_auth_routes
node_server -->|"mounts"| node_ai_routes
node_server -->|"mounts"| node_upload_routes
node_job_routes -->|"dispatches"| node_job_controller
node_application_routes -->|"dispatches"| node_application_controller
node_auth_routes -->|"dispatches"| node_auth_controller
node_ai_routes -->|"dispatches"| node_ai_controller
node_upload_routes -->|"dispatches"| node_upload_controller
node_job_controller -->|"queries"| node_job_model
node_job_controller -->|"queries"| node_application_model
node_application_controller -->|"reads/writes"| node_application_model
node_auth_controller -->|"reads/writes"| node_user_model
node_ai_controller -->|"loads and saves"| node_application_model
node_ai_controller -->|"loads job"| node_job_model
node_ai_controller -.->|"requests analysis"| node_groq
node_upload_controller -->|"uploads file"| node_cloudinary_util
node_cloudinary_util -.->|"stores file reference"| node_mongo
node_job_model -->|"persists"| node_mongo
node_application_model -->|"persists"| node_mongo
node_user_model -->|"persists"| node_mongo

click node_web "https://github.com/sankar-ayudham/ai-job-portal/blob/main/client/src/App.jsx"
click node_candidate_pages "https://github.com/sankar-ayudham/ai-job-portal/blob/main/client/src/pages/Jobs.jsx"
click node_recruiter_pages "https://github.com/sankar-ayudham/ai-job-portal/blob/main/client/src/pages/RecruiterDashboard.jsx"
click node_resume_page "https://github.com/sankar-ayudham/ai-job-portal/blob/main/client/src/pages/ResumeBuilder.jsx"
click node_client_api "https://github.com/sankar-ayudham/ai-job-portal/blob/main/client/src/api/axios.js"
click node_server "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/server.js"
click node_job_routes "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/routes/jobRoutes.js"
click node_application_routes "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/routes/applicationRoutes.js"
click node_auth_routes "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/routes/authRoutes.js"
click node_ai_routes "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/routes/aiRoutes.js"
click node_upload_routes "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/routes/uploadRoutes.js"
click node_auth_controller "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/authController.js"
click node_job_controller "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/jobController.js"
click node_application_controller "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/applicationController.js"
click node_recruiter_controller "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/recruiterController.js"
click node_ai_controller "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/aiController.js"
click node_upload_controller "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/uploadController.js"
click node_cloudinary_util "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/utils/cloudinary.js"
click node_mongo "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/config/db.js"
click node_user_model "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/User.js"
click node_job_model "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/Job.js"
click node_application_model "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/Application.js"
click node_profile_model "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/Profile.js"
click node_resume_model "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/Resume.js"
click node_saved_job_model "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/SavedJob.js"
click node_notification_model "https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/Notification.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_web,node_candidate_pages,node_recruiter_pages,node_resume_page,node_client_api toneBlue
class node_server,node_job_routes,node_application_routes,node_auth_routes,node_ai_routes,node_upload_routes toneAmber
class node_auth_controller,node_job_controller,node_application_controller,node_recruiter_controller toneMint
class node_ai_controller,node_upload_controller,node_cloudinary_util toneRose
class node_mongo,node_user_model,node_job_model,node_application_model,node_profile_model,node_resume_model,node_saved_job_model,node_notification_model,node_candidate,node_recruiter,node_groq toneIndigo
```

## Components

### Candidate and recruiter UI

- [React application](https://github.com/sankar-ayudham/ai-job-portal/blob/main/client/src/App.jsx): `client/src/App.jsx`
- [Candidate pages](https://github.com/sankar-ayudham/ai-job-portal/blob/main/client/src/pages/Jobs.jsx): `client/src/pages/Jobs.jsx`
- [Recruiter pages](https://github.com/sankar-ayudham/ai-job-portal/blob/main/client/src/pages/RecruiterDashboard.jsx): `client/src/pages/RecruiterDashboard.jsx`
- [Resume builder](https://github.com/sankar-ayudham/ai-job-portal/blob/main/client/src/pages/ResumeBuilder.jsx): `client/src/pages/ResumeBuilder.jsx`
- [API client](https://github.com/sankar-ayudham/ai-job-portal/blob/main/client/src/api/axios.js): `client/src/api/axios.js`

### API and access control

- [Express server](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/server.js): `server/server.js`
- [Job routes](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/routes/jobRoutes.js): `server/routes/jobRoutes.js`
- [Application routes](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/routes/applicationRoutes.js): `server/routes/applicationRoutes.js`
- [Auth routes](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/routes/authRoutes.js): `server/routes/authRoutes.js`
- [AI routes](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/routes/aiRoutes.js): `server/routes/aiRoutes.js`
- [Upload routes](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/routes/uploadRoutes.js): `server/routes/uploadRoutes.js`

### Hiring workflows

- [Authentication](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/authController.js): `server/controllers/authController.js`
- [Job search and management](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/jobController.js): `server/controllers/jobController.js`
- [Applications](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/applicationController.js): `server/controllers/applicationController.js`
- [Recruiter workflows](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/recruiterController.js): `server/controllers/recruiterController.js`

### AI and documents

- [ATS and resume AI](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/aiController.js): `server/controllers/aiController.js`
- [Resume upload](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/controllers/uploadController.js): `server/controllers/uploadController.js`
- [Cloud file storage](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/utils/cloudinary.js): `server/utils/cloudinary.js`

### Persistence

- [MongoDB](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/config/db.js): `server/config/db.js`
- [User records](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/User.js): `server/models/User.js`
- [Job records](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/Job.js): `server/models/Job.js`
- [Application records](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/Application.js): `server/models/Application.js`
- [Candidate profiles](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/Profile.js): `server/models/Profile.js`
- [Resume records](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/Resume.js): `server/models/Resume.js`
- [Saved jobs](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/SavedJob.js): `server/models/SavedJob.js`
- [Notifications](https://github.com/sankar-ayudham/ai-job-portal/blob/main/server/models/Notification.js): `server/models/Notification.js`

### Other components

- **Candidate**
- **Recruiter**
- **Groq LLM**

## Connections

- Candidate → React application: uses
- Recruiter → React application: uses
- React application → Candidate pages: routes to
- React application → Recruiter pages: routes to
- React application → Resume builder: routes to
- Candidate pages → API client: requests
- Recruiter pages → API client: requests
- Resume builder → API client: requests
- API client → Express server: REST calls
- Express server → Job routes: mounts
- Express server → Application routes: mounts
- Express server → Auth routes: mounts
- Express server → AI routes: mounts
- Express server → Upload routes: mounts
- Job routes → Job search and management: dispatches
- Application routes → Applications: dispatches
- Auth routes → Authentication: dispatches
- AI routes → ATS and resume AI: dispatches
- Upload routes → Resume upload: dispatches
- Job search and management → Job records: queries
- Job search and management → Application records: queries
- Applications → Application records: reads/writes
- Authentication → User records: reads/writes
- ATS and resume AI → Application records: loads and saves
- ATS and resume AI → Job records: loads job
- ATS and resume AI → Groq LLM: requests analysis
- Resume upload → Cloud file storage: uploads file
- Cloud file storage → MongoDB: stores file reference
- Job records → MongoDB: persists
- Application records → MongoDB: persists
- User records → MongoDB: persists
