AI-powered recruitment platform for resume screening, candidate matching, and hiring assistance.
Extracts structured data from resumes using OCR + LLMs, stores them with vector embeddings for semantic search, and matches candidates against job descriptions.
Category
Features
Document Processing
PDF/image upload, Llama Scout OCR, batch processing, field extraction, verification workflow
Search & Matching
Semantic search (Gemini embeddings), hybrid search (BM25 + vector), JD matching, natural language queries
AI Assistants
Shortlist refinement (filter/reset/undo), hiring analysis & recommendations, profile chat
Platform
Analytics dashboard, JWT auth, role-based access (recruiter/job_seeker), profile management
Layer
Technologies
Backend
FastAPI, Python 3.10+, MongoDB Atlas, LangChain, LangGraph
AI/ML
Groq (Llama Scout 17B OCR, Llama 3.3 70B LLM), Gemini (embeddings)
Frontend
React 18, TypeScript, Vite 5, Tailwind CSS, shadcn/ui, TanStack Query
Auth
PyJWT + bcrypt, role-based access
Search
BM25 + cosine similarity hybrid ranking
Frontend (React + Vite) <--- REST ---> Backend (FastAPI)
- Dashboard Multi-Agent Pipeline
- Search Document -> OCR -> Extract ->
- Upload Embed -> Store
- JD Matching
- Chat AI: Groq (Llama) + Gemini
DB: MongoDB (Documents + Vectors)
Processing Pipeline:
Upload -> Classification -> OCR Extraction -> Field Extraction -> Embedding -> MongoDB
Requirement
Version
Python
3.10+
Node.js
18+
MongoDB
6.0+ (Atlas recommended)
Poppler
Latest
git clone < repository-url>
cd job-profile-screening
cd backend
python -m venv venv
venv\S cripts\a ctivate # Windows
source venv/bin/activate # Linux/Mac
pip install -r requirements.txt
cp .env.example .env # Edit with your API keys
uvicorn src.main:app --reload --port 8000
cd frontend
npm install
npm run dev
# Build and run
docker-compose up --build
# Stop
docker-compose down
Push code to GitHub
Create Web Service on Render → connect repo → Root Directory: backend → Runtime: Docker
Set environment variables in Render dashboard:
GROQ_API_KEY=your_key
GEMINI_API_KEY=your_key
MONGO_DB_URI=mongodb+srv://...
JWT_SECRET=your_secret
Variable
Required
Description
GROQ_API_KEY
Yes
Groq API key for Llama models
GEMINI_API_KEY
Yes
Google Gemini API key
MONGO_DB_URI
Yes
MongoDB connection string
JWT_SECRET
Yes
JWT signing secret (min 32 chars)
LOG_LEVEL
No
DEBUG, INFO, WARNING, ERROR (default: INFO)
Frontend (frontend/.env.local)
Variable
Default
Description
VITE_API_BASE
http://localhost:8000
Backend API URL
All endpoints prefixed with /api/v1. Full docs at /docs.
Method
Endpoint
Description
POST
/auth/signup
Register user
POST
/auth/login
Login, get JWT
Method
Endpoint
Description
POST
/resumes/upload
Upload resume
POST
/resumes/upload-batch
Batch upload
GET
/resumes/
List profiles (paginated)
GET
/resumes/{id}
Get profile
GET
/resumes/search/hybrid
Hybrid search
PATCH
/resumes/{id}/fields
Update fields (draft)
POST
/resumes/{id}/verify
Verify and index
DELETE
/resumes/{id}
Delete profile
Method
Endpoint
Description
POST
/jd/upload
Upload JD, get matches
GET
/jd/
List JDs
GET
/jd/{id}/matches
Get matches
DELETE
/jd/{id}
Delete JD
Method
Endpoint
Description
GET
/dashboard/summary
Full analytics
GET
/dashboard/skills
Skills breakdown
GET
/dashboard/experience
Experience distribution
GET
/dashboard/domains
Domain stats
Method
Endpoint
Description
POST
/chat/shortlist-assist
Refine shortlist
POST
/chat/hiring-assist
Hiring recommendations
POST
/chat/{profile_id}
Chat with profile
POST
/chat/clear
Clear session
Database Setup (MongoDB Atlas)
Create cluster at mongodb.com/cloud/atlas
Create database: docsmith
Create vector search index on resumes collection:
{
"name" : " vector_index" ,
"type" : " vectorSearch" ,
"definition" : {
"fields" : [{
"type" : " vector" ,
"path" : " embedding" ,
"numDimensions" : 768 ,
"similarity" : " cosine"
}]
}
}
Create standard indexes:
db . resumes . createIndex ( { "extracted_data.name" : 1 } )
db . resumes . createIndex ( { "extracted_data.skills" : 1 } )
db . resumes . createIndex ( { "extracted_data.total_experience_years" : 1 } )
db . resumes . createIndex ( { "status" : 1 } )
db . resumes . createIndex ( { "created_at" : - 1 } )
job-profile-screening/
├── backend/
│ ├── src/
│ │ ├── main.py # FastAPI entry point
│ │ ├── agents/ # 8 AI agents (orchestrator, OCR, extraction, chat)
│ │ ├── api/routers/ # 5 REST routers (auth, resumes, jd, dashboard, chat)
│ │ ├── core/ # Config, logging, JWT security
│ │ ├── database/ # MongoDB connection, models, user repo
│ │ ├── memory/ # Chat history, shortlist sessions
│ │ ├── schemas/ # Pydantic models
│ │ ├── services/ # Groq, Gemini, MongoDB, search services
│ │ ├── utils/ # Image converter, text cleaner, prompts
│ │ └── workflows/ # Document processing pipeline
│ ├── data/ # Uploads, page images, resumes, JDs
│ ├── Dockerfile
│ ├── requirements.txt
│ └── .env.example
├── frontend/
│ └── src/
│ ├── pages/ # 12 route-level pages
│ ├── components/ # UI (shadcn), auth, layout, search, upload, chat
│ ├── hooks/ # Custom React hooks
│ ├── lib/ # API client, utilities
│ └── types/ # TypeScript interfaces
├── docker-compose.yml
├── ARCHITECTURE.md
└── README.md
Register at /auth as recruiter or job_seeker
Upload resumes at /upload (single or batch, PDF/image)
Review & verify extracted data on profile pages
Search candidates at /search using natural language queries
Upload JDs at /jd-search to auto-match candidates
Use AI assistants for shortlist refinement and hiring analysis
View analytics on the dashboard (skills, experience, domains)
Issue
Solution
ModuleNotFoundError
Activate venv, run pip install -r requirements.txt
MongoDB connection failed
Check MONGO_DB_URI and network access
Groq API errors
Verify API key and quota
PDF processing fails
Install Poppler
CORS errors
Backend allows http://localhost:8080 by default
Frontend blank page
Check browser console, verify backend is running
Proprietary software. All rights reserved.