ProHire Nexus is a full-stack, microservice-based job portal built to connect job seekers and recruiters in one intelligent platform.
It combines job discovery, application management, ATS resume analysis, AI-powered career guidance, asynchronous email notifications, and premium subscriptions.
Developed and maintained by Satvik Jambagi.
- Overview
- Key Features
- Tech Stack
- Architecture
- Repository Structure
- Database Design
- API Endpoints
- AI and Integration Flows
- Setup and Installation
- Environment Variables
- License
ProHire Nexus is designed as a decoupled system where each backend service owns a focused responsibility. The frontend consumes these services through clean HTTP APIs, while supporting systems such as Redis, Kafka, Cloudinary, Gemini, and Razorpay power caching, automation, AI, storage, and payments.
This architecture keeps the platform modular, scalable, and easy to extend.
- Job portal for both seekers and recruiters with separate flows for profile management, company creation, job posting, and applications.
- AI-powered career guidance using Gemini to recommend next roles, learning paths, and skill gaps.
- ATS resume analysis to evaluate resume quality, structure, and keyword alignment.
- Asynchronous email notifications through Kafka and Nodemailer.
- Premium subscriptions secured with Razorpay payment verification.
- Cloudinary-based media handling for resumes, profile pictures, and company logos.
- Redis-backed session caching for faster auth/session validation.
- Microservice architecture with independent services for auth, users, jobs, payments, and utilities.
- Next.js 16
- React 19
- TypeScript
- Tailwind CSS
- Radix UI
- Node.js
- Express 5
- TypeScript
- PostgreSQL on Neon Serverless
- Redis on Upstash
- Apache Kafka
- Cloudinary
- Gmail SMTP
- Razorpay
- Google Gemini AI
graph TD
Client["Next.js Client (Port 3000)"]
Client -->|HTTP| Auth["Auth Service (Port 5000)"]
Client -->|HTTP| Utils["Utils Service (Port 5001)"]
Client -->|HTTP| User["User Service (Port 5002)"]
Client -->|HTTP| Job["Job Service (Port 5003)"]
Client -->|HTTP| Payment["Payment Service (Port 5004)"]
Auth --> DB[("PostgreSQL / Neon")]
Utils --> DB
User --> DB
Job --> DB
Payment --> DB
Auth --> Redis[("Redis / Upstash")]
Job --> Kafka["Apache Kafka"]
Kafka --> Utils
Utils --> Gemini["Google Gemini AI"]
Utils --> Cloudinary["Cloudinary"]
Utils --> SMTP["Gmail SMTP"]
Payment --> Razorpay["Razorpay API"]
- Auth Service: registration, login, password reset, JWT/session handling.
- User Service: profile management, resume upload, skill mapping, job applications.
- Job Service: company management, job posting, job browsing, application review.
- Utils Service: file uploads, AI career guidance, ATS analysis, email consumption.
- Payment Service: checkout creation and payment verification.
ProHire Nexus/
├── frontend/ # Next.js client application
│ └── src/
│ ├── app/ # App Router pages and layouts
│ ├── components/ # Shared UI components
│ └── context/ # Client-side state and API wrappers
└── services/
├── auth/ # Authentication service
├── utils/ # AI, upload, and email service
├── user/ # User profile and application service
├── job/ # Company and job listing service
└── payment/ # Razorpay payment service
The services create and use a shared PostgreSQL schema.
- users: stores profile, auth, resume, profile picture, and subscription data.
- skills: master list of skills.
- user_skills: many-to-many mapping between users and skills.
- companies: recruiter-managed company profiles.
- jobs: job listings posted by companies.
- applications: job applications submitted by users.
user_role:jobseeker,recruiterjob_type:Full-time,Part-time,Contract,Internshipwork_location:On-site,Remote,Hybridapplication_status:Submitted,Rejected,Hired
POST /api/auth/register— create a new user accountPOST /api/auth/login— authenticate a user and issue a JWTPOST /api/auth/forgot— generate a password reset tokenPOST /api/auth/reset/:token— reset password using token
GET /api/user/me— fetch logged-in user profileGET /api/user/:userId— fetch public profile by IDPUT /api/user/update/profile— update name, phone number, and bioPUT /api/user/update/pic— update profile picturePUT /api/user/update/resume— upload or replace resumePOST /api/user/skill/add— add a skill to a userPUT /api/user/skill/delete— remove a skill from a userPOST /api/user/apply/job— apply to a jobGET /api/user/application/all— list the user’s applications
POST /api/job/company/new— create a companyDELETE /api/job/company/:companyId— delete a companyPOST /api/job/new— create a job listingPUT /api/job/:jobId— update a job listingGET /api/job/company/all— list all companiesGET /api/job/company/:id— get company detailsGET /api/job/all— list active jobs with search supportGET /api/job/:jobId— get a specific jobGET /api/job/application/:jobId— list applicants for a jobPUT /api/job/application/update/:id— update application status and trigger notification
POST /api/utils/upload— upload files to CloudinaryPOST /api/utils/career— generate AI career guidancePOST /api/utils/resume-analyser— generate ATS resume analysis
POST /api/payment/checkout— create a Razorpay orderPOST /api/payment/verify— verify payment signature and activate subscription
The utils service takes a user’s skills and career context, then returns a structured recommendation payload with role suggestions, skill gaps, and learning advice.
The resume analyzer processes PDF resumes and produces a structured evaluation containing:
- ATS score
- score breakdown
- strengths
- suggestions
- summary
When job applications are updated or user events occur, the job service publishes an email event to Kafka. The utils service consumes the message and sends the email through Gmail SMTP.
- A checkout order is created in the payment service.
- The frontend opens the Razorpay checkout window.
- Razorpay returns payment confirmation fields.
- The payment service validates the signature with HMAC SHA256.
- The user’s subscription is updated on success.
Make sure you have:
- Node.js v18 or above
- Git
- PostgreSQL or a Neon Serverless database
- Redis (local or Upstash)
- Apache Kafka
- Cloudinary account
- Google Gemini API key
- Gmail account with App Password
- Razorpay account and test credentials
git clone https://github.com/7vik2005/ProHire-Nexus.git
cd ProHire-Nexus# Frontend
cd frontend
npm install
cd ..
# Auth service
cd services/auth
npm install
cd ../..
# Utils service
cd services/utils
npm install
cd ../..
# User service
cd services/user
npm install
cd ../..
# Job service
cd services/job
npm install
cd ../..
# Payment service
cd services/payment
npm install
cd ../..Open separate terminals and start each service:
# Frontend
cd frontend
npm run dev
# Auth
cd services/auth
npm run dev
# Utils
cd services/utils
npm run dev
# User
cd services/user
npm run dev
# Job
cd services/job
npm run dev
# Payment
cd services/payment
npm run devCreate .env files for each service.
PORT=5000
DB_URL=postgresql://DB_USER:DB_PASSWORD@DB_HOST/DB_NAME?sslmode=require
UPLOAD_SERVICE=http://localhost:5001
JWT_SEC=your_jwt_secret_key_here
Kafka_Broker=localhost:9092
Frontend_Url=http://localhost:3000
Redis_url=rediss://default:REDIS_PASSWORD@REDIS_HOST:REDIS_PORTPORT=5001
CLOUD_NAME=your_cloudinary_cloud_name
API_KEY=your_cloudinary_api_key
API_SECRET=your_cloudinary_api_secret
Kafka_Broker=localhost:9092
SMTP_USER=your_gmail_address@gmail.com
SMTP_PASS=your_gmail_app_password
API_KEY_GEMINI=your_gemini_api_keyPORT=5002
DB_URL=postgresql://DB_USER:DB_PASSWORD@DB_HOST/DB_NAME?sslmode=require
UPLOAD_SERVICE=http://localhost:5001
JWT_SEC=your_jwt_secret_key_herePORT=5003
DB_URL=postgresql://DB_USER:DB_PASSWORD@DB_HOST/DB_NAME?sslmode=require
UPLOAD_SERVICE=http://localhost:5001
JWT_SEC=your_jwt_secret_key_here
Kafka_Broker=localhost:9092PORT=5004
Razorpay_Key=rzp_test_your_razorpay_key
Razorpay_Secret=your_razorpay_secret
DB_URL=postgresql://DB_USER:DB_PASSWORD@DB_HOST/DB_NAME?sslmode=require
JWT_SEC=your_jwt_secret_key_hereThis project is licensed under the MIT License. See the LICENSE file for details.