Skip to content

Shikha307/JUMBLE

Folders and files

NameName
Last commit message
Last commit date

Latest commit

Β 

History

146 Commits
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 
Β 

Repository files navigation

JUMBLE πŸ”€

A swipe-based job matching platform β€” like Tinder, but for jobs.

Candidates swipe on job postings, recruiters swipe on candidates, and when both sides match it's a Mutual Match πŸŽ‰. An ML engine ranks listings by semantic relevance so the best fits always surface first.


Architecture

β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚                      React Frontend                         β”‚
β”‚              Vite + React  (port 5173)                      β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
          β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”΄β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
          β–Ό                             β–Ό
β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”    β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
β”‚  User-Job Service   β”‚    β”‚   Swipe-Match Service     β”‚
β”‚  Spring Boot :8081  β”‚    β”‚   Spring Boot :8080       β”‚
β”‚  MongoDB Β· JWT Auth β”‚    β”‚   Redis Β· MongoDB         β”‚
β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜    β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
          β”‚                             β”‚
          β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”¬β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β–Ό
               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
               β”‚   MongoDB Atlas  β”‚
               β”‚   (jumbledb)     β”‚
               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜
                         β”‚
               β”Œβ”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”
               β”‚  Python ML Workerβ”‚
               β”‚  matcher.py      β”‚
               β”‚  (background)    β”‚
               β””β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”€β”˜

Tech Stack

Layer Technology
Frontend React 18, Vite, Vanilla CSS
User & Job Service Spring Boot 3, Spring Security, JWT, MongoDB
Swipe & Match Service Spring Boot 3, Redis (queues), MongoDB
ML Engine Python 3, Sentence Transformers (all-MiniLM-L6-v2), PyTorch
Database MongoDB Atlas
Cache / Queue Redis (Docker)

Features

  • πŸ” JWT Authentication β€” Secure login for Candidates and Recruiters
  • πŸ’Ό Recruiter Dashboard β€” Post jobs, swipe on candidates, filter by country
  • πŸ‘€ Candidate Dashboard β€” Swipe on ML-ranked job postings
  • 🀝 Mutual Matches β€” See only confirmed two-way matches
  • πŸ“„ Resume Viewer β€” Inline PDF viewer with secure authenticated fetch
  • πŸ”— LinkedIn Integration β€” Candidate LinkedIn profiles on match cards
  • πŸ€– ML Ranking β€” Semantic similarity scores via sentence-transformers
  • 🏒 Company Name Display β€” Company shown on all job cards

Prerequisites

Requirement Version
Java (JDK) 21
Node.js 18+
Python 3.9+
Docker Desktop Latest
Maven Bundled via mvnw

Getting Started

1. Clone the repo

git clone https://github.com/Shikha307/JUMBLE.git
cd JUMBLE

2. Start Redis (Docker)

cd swipe-match-service
docker compose up -d redis

3. Start the User-Job Service (port 8081)

# From project root
$env:JAVA_HOME="C:\Program Files\Java\jdk-21.0.10"
.\mvnw.cmd spring-boot:run

4. Start the Swipe-Match Service (port 8080)

# From /swipe-match-service
$env:JAVA_HOME="C:\Program Files\Java\jdk-21.0.10"
.\mvnw.cmd spring-boot:run

5. Start the ML Worker

cd ml
pip install pymongo sentence-transformers torch
python matcher.py

The worker runs continuously, polling MongoDB every 10 seconds and regenerating match score JSON files whenever new jobs or candidates are added.

6. Start the Frontend (port 5173)

cd client
npm install
npm run dev

Open http://localhost:5173 in your browser.


Environment / Configuration

All configuration lives in:

File Purpose
src/main/resources/application.yml User-Job service (port, MongoDB URI)
swipe-match-service/src/main/resources/application.properties Swipe-Match service (port, Redis, MongoDB URI)
ml/matcher.py MongoDB URI for the ML worker

Note: MongoDB Atlas credentials are embedded for local hackathon use. Rotate these before any public deployment.


API Overview

User-Job Service (localhost:8081)

Method Endpoint Description
POST /api/auth/register Register candidate or recruiter
POST /api/auth/login Login, returns JWT
GET /api/candidates/me Get own candidate profile
PUT /api/candidates/me/profile Update skills, resume, LinkedIn
GET /api/candidates/{id}/resume Download resume (auth required)
GET /api/recruiters/{id} Get recruiter + company info
GET /api/recruiters/{id}/jobs List jobs for a recruiter
GET /api/jobs/all List all job postings

Swipe-Match Service (localhost:8080)

Method Endpoint Description
POST /api/v1/swipes Record a swipe (RIGHT/LEFT)
GET /api/v1/swipes/candidates/{id}/unswiped-jobs Jobs a candidate hasn't swiped on
GET /api/v1/swipes/jobs/{id}/unswiped-candidates Candidates a recruiter hasn't swiped on
GET /api/v1/matches/recruiter/{id} All mutual matches for a recruiter
GET /api/v1/matches/candidate/{id} All mutual matches for a candidate

ML Matching

The Python worker (ml/matcher.py):

  1. Loads sentence-transformers/all-MiniLM-L6-v2 (uses GPU if available)
  2. On startup, computes a full candidate Γ— job similarity matrix
  3. Every 10 seconds, checks for new documents and recalculates if any are found
  4. Outputs ranked JSON files to:
    • client/public/ml_outputs/jobs_prioritized/{candidateId}.json
    • client/public/ml_outputs/candidates_prioritized/{jobId}.json

The frontend reads these static JSON files to sort cards by match score.


Project Structure

JUMBLE/
β”œβ”€β”€ client/                   # React frontend (Vite)
β”‚   └── src/
β”‚       β”œβ”€β”€ pages/            # Matches, RecruiterHome, AddJob...
β”‚       β”œβ”€β”€ components/       # CandidateCard, Navbar...
β”‚       └── public/ml_outputs # ML-generated match scores
β”‚
β”œβ”€β”€ src/                      # User-Job Service (Spring Boot)
β”‚   └── main/java/com/jumble/userjob/
β”‚       β”œβ”€β”€ auth/             # JWT auth
β”‚       β”œβ”€β”€ candidate/        # Candidate + Recruiter controllers
β”‚       └── job/              # Job CRUD
β”‚
β”œβ”€β”€ swipe-match-service/      # Swipe & Match Service (Spring Boot)
β”‚   β”œβ”€β”€ docker-compose.yml    # Redis + service
β”‚   └── src/main/java/com/jumble/swipematch/
β”‚
└── ml/
    └── matcher.py            # Python ML worker

About

A swipe based matching algorithm for job applications.

Resources

Stars

Watchers

Forks

Releases

No releases published

Packages

 
 
 

Contributors