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.
βββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββββ
β 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) β
ββββββββββββββββββββ
| 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) |
- π 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
| Requirement | Version |
|---|---|
| Java (JDK) | 21 |
| Node.js | 18+ |
| Python | 3.9+ |
| Docker Desktop | Latest |
| Maven | Bundled via mvnw |
git clone https://github.com/Shikha307/JUMBLE.git
cd JUMBLEcd swipe-match-service
docker compose up -d redis# From project root
$env:JAVA_HOME="C:\Program Files\Java\jdk-21.0.10"
.\mvnw.cmd spring-boot:run# From /swipe-match-service
$env:JAVA_HOME="C:\Program Files\Java\jdk-21.0.10"
.\mvnw.cmd spring-boot:runcd ml
pip install pymongo sentence-transformers torch
python matcher.pyThe worker runs continuously, polling MongoDB every 10 seconds and regenerating match score JSON files whenever new jobs or candidates are added.
cd client
npm install
npm run devOpen http://localhost:5173 in your browser.
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.
| 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 |
| 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 |
The Python worker (ml/matcher.py):
- Loads
sentence-transformers/all-MiniLM-L6-v2(uses GPU if available) - On startup, computes a full candidate Γ job similarity matrix
- Every 10 seconds, checks for new documents and recalculates if any are found
- Outputs ranked JSON files to:
client/public/ml_outputs/jobs_prioritized/{candidateId}.jsonclient/public/ml_outputs/candidates_prioritized/{jobId}.json
The frontend reads these static JSON files to sort cards by match score.
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