Skip to content

Repository files navigation

πŸš€ NextHire

AI-Powered Career Preparation Platform

React Node.js Python MongoDB License

Features β€’ Architecture β€’ Installation β€’ API Reference β€’ Deployment


πŸ“– Overview

NextHire is an intelligent, end-to-end career preparation platform that leverages AI/ML to help job seekers optimize their resumes, practice for interviews, and ace technical assessments. The platform combines advanced NLP techniques with Google's Gemini AI to provide personalized feedback and recommendations.

🎯 Problem Statement

Job seekers often struggle with:

  • Understanding what ATS (Applicant Tracking Systems) look for
  • Identifying skill gaps between their resume and job requirements
  • Preparing effectively for technical interviews
  • Building ATS-friendly resumes

πŸ’‘ Solution

NextHire addresses these challenges through:

  • Hybrid ATS Analysis: Combines BERT embeddings with fuzzy matching for accurate skill extraction
  • AI Mock Interviews: Gemini-powered interviews with real-time feedback
  • Smart Mock Tests: Auto-generated assessments based on job descriptions
  • Resume Builder: Multiple ATS-friendly templates with PDF export

✨ Features

Feature Description
πŸ“Š ATS Resume Analyzer Hybrid scoring using BERT semantic similarity + fuzzy matching
🎀 AI Mock Interview Voice-enabled interviews with Gemini AI analysis
πŸ“ Mock Assessments JD-based MCQ tests with detailed explanations
πŸ“„ Resume Builder 4 ATS-friendly templates with photo support & PDF export
πŸ“š Learning Resources Curated resources via YouTube & Serper API
πŸ“ˆ Dashboard Track progress, scores, and interview history
πŸ” Google OAuth Secure authentication with Google Sign-In

πŸ— System Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                              NEXTHIRE PLATFORM                               β”‚
β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€
β”‚                                                                              β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚  β”‚                  β”‚    β”‚                  β”‚    β”‚                  β”‚      β”‚
β”‚  β”‚    FRONTEND      β”‚    β”‚    BACKEND       β”‚    β”‚   ATS SERVICE    β”‚      β”‚
β”‚  β”‚    (React)       │◄──►│   (Node.js)      │◄──►│   (Python)       β”‚      β”‚
β”‚  β”‚                  β”‚    β”‚                  β”‚    β”‚                  β”‚      β”‚
β”‚  β”‚  β€’ Vite          β”‚    β”‚  β€’ Express.js    β”‚    β”‚  β€’ Flask         β”‚      β”‚
β”‚  β”‚  β€’ Tailwind CSS  β”‚    β”‚  β€’ Mongoose      β”‚    β”‚  β€’ spaCy         β”‚      β”‚
β”‚  β”‚  β€’ Framer Motion β”‚    β”‚  β€’ JWT Auth      β”‚    β”‚  β€’ Transformers  β”‚      β”‚
β”‚  β”‚  β€’ Shadcn/UI     β”‚    β”‚  β€’ Multer        β”‚    β”‚  β€’ PyMuPDF       β”‚      β”‚
β”‚  β”‚                  β”‚    β”‚                  β”‚    β”‚                  β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β”‚           β”‚                       β”‚                       β”‚                 β”‚
β”‚           β”‚                       β”‚                       β”‚                 β”‚
β”‚           β–Ό                       β–Ό                       β–Ό                 β”‚
β”‚  β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”      β”‚
β”‚  β”‚                        EXTERNAL SERVICES                          β”‚      β”‚
β”‚  β”œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€      β”‚
β”‚  β”‚   MongoDB    β”‚  Gemini AI   β”‚  Google      β”‚   YouTube/Serper    β”‚      β”‚
β”‚  β”‚   Atlas      β”‚  API         β”‚  OAuth 2.0   β”‚   APIs              β”‚      β”‚
β”‚  β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜      β”‚
β”‚                                                                              β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

πŸ”„ Sequence Diagrams

ATS Resume Analysis Flow

sequenceDiagram
    participant U as User
    participant F as Frontend
    participant B as Backend
    participant A as ATS Service
    participant DB as MongoDB

    U->>F: Upload Resume + JD
    F->>B: POST /api/analyze
    B->>A: Forward files to Flask
    A->>A: Extract text (PyMuPDF)
    A->>A: spaCy NER + PhraseMatcher
    A->>A: BERT Semantic Matching
    A->>A: Fuzzy String Matching
    A->>A: Calculate Hybrid Score
    A-->>B: Return Analysis JSON
    B->>DB: Save Analysis Record
    B-->>F: Return Results
    F-->>U: Display Score & Feedback
Loading

Mock Interview Flow

sequenceDiagram
    participant U as User
    participant F as Frontend
    participant B as Backend
    participant G as Gemini AI
    participant DB as MongoDB

    U->>F: Select JD & Start Interview
    F->>B: POST /api/mockinterview/create
    B->>DB: Fetch JD Details
    B->>G: Generate Questions (Gemini 2.5)
    G-->>B: Return 8 Questions
    B->>DB: Save Interview Session
    B-->>F: Return Questions
    
    loop For Each Question
        F->>U: Display Question (TTS)
        U->>F: Voice Response (Web Speech API)
        F->>B: POST /submit-response
        B->>DB: Save Transcript
    end
    
    F->>B: POST /complete
    B->>G: Analyze All Responses
    G-->>B: Return Detailed Feedback
    B->>DB: Save Analysis
    B-->>F: Return Results
    F-->>U: Display Feedback & Score
Loading

Mock Test Flow

sequenceDiagram
    participant U as User
    participant F as Frontend
    participant B as Backend
    participant G as Gemini AI
    participant DB as MongoDB

    U->>F: Select JD + Question Count
    F->>B: POST /api/mocktest/create
    B->>DB: Fetch JD & Skills
    B->>G: Generate MCQs (Gemini 2.5)
    G-->>B: Return Questions + Options
    B->>DB: Save Test Session
    B-->>F: Return Exam Data
    
    U->>F: Answer Questions
    F->>B: POST /api/mocktest/submit
    B->>G: Evaluate Answers
    G-->>B: Return Scores & Explanations
    B->>DB: Save Attempt
    B-->>F: Return Results
    F-->>U: Display Score & Feedback
Loading

πŸ›  Tech Stack

Frontend

Technology Purpose
React 18 UI Framework
Vite Build Tool
Tailwind CSS Styling
Framer Motion Animations
Shadcn/UI Component Library
Axios HTTP Client
React Router Navigation
Web Speech API Voice Recognition/TTS
html2pdf.js PDF Generation

Backend

Technology Purpose
Node.js Runtime
Express.js Web Framework
MongoDB Database
Mongoose ODM
JWT Authentication
Multer File Upload
Axios API Calls
Google Auth OAuth 2.0

ATS Service (Python)

Technology Purpose
Flask Web Framework
spaCy NLP Processing
Sentence Transformers BERT Embeddings
RapidFuzz Fuzzy Matching
PyMuPDF PDF Parsing
scikit-learn Cosine Similarity
Transformers NER Models

External APIs

Service Purpose
Google Gemini 2.5 AI Question Generation & Analysis
YouTube Data API Learning Resources
Serper API Web Search for Resources
Google OAuth User Authentication

πŸ“ Project Structure

nexthire/
β”œβ”€β”€ frontend/                    # React Frontend
β”‚   β”œβ”€β”€ src/
β”‚   β”‚   β”œβ”€β”€ components/ui/       # Shadcn UI Components
β”‚   β”‚   β”œβ”€β”€ pages/              # Page Components
β”‚   β”‚   β”‚   β”œβ”€β”€ Home.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ Login.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ AtsAnalysis.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ MockTest.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ MockInterview.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ ResumeBuilder.jsx
β”‚   β”‚   β”‚   β”œβ”€β”€ Resources.jsx
β”‚   β”‚   β”‚   └── Dashboard.jsx
β”‚   β”‚   β”œβ”€β”€ styles/             # CSS Styles
β”‚   β”‚   └── App.jsx             # Main App
β”‚   └── package.json
β”‚
β”œβ”€β”€ backend/                     # Node.js Backend
β”‚   β”œβ”€β”€ Controllers/
β”‚   β”‚   β”œβ”€β”€ analyzeController.js
β”‚   β”‚   β”œβ”€β”€ mockTestController.js
β”‚   β”‚   β”œβ”€β”€ mockInterviewController.js
β”‚   β”‚   └── resumeController.js
β”‚   β”œβ”€β”€ models/
β”‚   β”‚   β”œβ”€β”€ User.js
β”‚   β”‚   β”œβ”€β”€ JD.js
β”‚   β”‚   β”œβ”€β”€ MockTest.js
β”‚   β”‚   β”œβ”€β”€ MockInterview.js
β”‚   β”‚   └── Resume.js
β”‚   β”œβ”€β”€ routes/
β”‚   β”œβ”€β”€ middleware/
β”‚   └── index.js
β”‚
β”œβ”€β”€ ats-skill-analyzer/          # Python ATS Service
β”‚   β”œβ”€β”€ app/
β”‚   β”‚   β”œβ”€β”€ main.py             # Flask App
β”‚   β”‚   β”œβ”€β”€ extractor.py        # Skill Extraction
β”‚   β”‚   β”œβ”€β”€ matcher.py          # Skill Matching
β”‚   β”‚   β”œβ”€β”€ semantic_matcher.py # BERT Matching
β”‚   β”‚   └── data/               # Skill Datasets
β”‚   β”œβ”€β”€ requirements.txt
β”‚   └── run.py
β”‚
└── README.md

βš™οΈ Installation

Prerequisites

  • Node.js 18+
  • Python 3.10+
  • MongoDB (local or Atlas)
  • Google Cloud Console account (for OAuth)
  • Gemini API key

1️⃣ Clone Repository

git clone https://github.com/tharun2107/nexthire.git
cd nexthire

2️⃣ Setup Backend

cd backend
npm install

Create .env file:

MONGO_URI=mongodb+srv://your-connection-string
JWT_SECRET=your-jwt-secret
GOOGLE_CLIENT_ID=your-google-client-id
GOOGLE_CLIENT_SECRET=your-google-client-secret
GEMINI_API_KEY=your-gemini-api-key
ATS_SERVICE_URL=http://localhost:5000

Start backend:

npm start
# Server runs on http://localhost:5001

3️⃣ Setup ATS Service

cd ats-skill-analyzer
python -m venv venv
venv\Scripts\activate  # Windows
# source venv/bin/activate  # Mac/Linux

pip install -r requirements.txt
python -m spacy download en_core_web_sm

Start ATS service:

python run.py
# Server runs on http://localhost:5000

4️⃣ Setup Frontend

cd frontend
npm install

Create .env file:

VITE_API_URL=http://localhost:5001
VITE_GOOGLE_CLIENT_ID=your-google-client-id

Start frontend:

npm run dev
# App runs on http://localhost:5173

πŸ“‘ API Reference

Authentication

Endpoint Method Description
/auth/google POST Google OAuth login

ATS Analysis

Endpoint Method Description
/api/analyze POST Analyze resume against JD
/api/jd POST Create new JD
/api/jd GET Get all JDs

Mock Test

Endpoint Method Description
/api/mocktest/create POST Generate new test
/api/mocktest/submit POST Submit test answers
/api/mocktest/history GET Get test history

Mock Interview

Endpoint Method Description
/api/mockinterview/create POST Start new interview
/api/mockinterview/submit-response POST Submit answer
/api/mockinterview/complete POST Complete & get analysis
/api/mockinterview/history GET Get interview history

Resume

Endpoint Method Description
/api/resume/create POST Save resume
/api/resume GET Get all resumes
/api/resume/:id GET Get resume by ID
/api/resume/update/:id PUT Update resume
/api/resume/delete/:id DELETE Delete resume

πŸš€ Deployment

Architecture for Production

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”     β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚   Vercel    β”‚     β”‚   Render    β”‚     β”‚   Render    β”‚
β”‚  (Frontend) │────▢│  (Backend)  │────▢│ (ATS/Python)β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜     β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                           β”‚
                           β–Ό
                    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
                    β”‚  MongoDB    β”‚
                    β”‚   Atlas     β”‚
                    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Deploy Frontend (Vercel)

cd frontend
vercel --prod

Deploy Backend (Render)

  1. Create Web Service on Render
  2. Connect GitHub repository
  3. Set root directory: backend
  4. Build command: npm install
  5. Start command: node index.js
  6. Add environment variables

Deploy ATS Service (Render)

  1. Create Web Service on Render
  2. Set root directory: ats-skill-analyzer
  3. Build command: pip install -r requirements.txt && python -m spacy download en_core_web_sm
  4. Start command: gunicorn -w 2 -b 0.0.0.0:$PORT run:app

πŸ“Έ Screenshots

Home Page Login Page
Home Login
ATS Analysis Mock Interview
ATS Interview
Resume Builder Dashboard
Resume Dashboard

🀝 Contributing

Contributions are welcome! Please follow these steps:

  1. Fork the repository
  2. Create a feature branch (git checkout -b feature/AmazingFeature)
  3. Commit changes (git commit -m 'Add AmazingFeature')
  4. Push to branch (git push origin feature/AmazingFeature)
  5. Open a Pull Request

Code Style

  • Frontend: ESLint + Prettier
  • Backend: Standard Node.js conventions
  • Python: PEP 8

πŸ“ License

This project is licensed under the MIT License - see the LICENSE file for details.


πŸ‘¨β€πŸ’» Author

Tharun Kudikyala


⭐ Star this repo if you found it helpful!

Made with ❀️ by Tharun

About

No description, website, or topics provided.

Resources

Stars

0 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages