An AI-driven job recommendation platform.
Users log in, upload a resume, and an LLM generates 7β8 tailored questions. Resume data + answers are scored:
- Score < 60 β show popup warning, user may retry.
- Score β₯ 60 β system fetches jobs (e.g., from LinkedIn) and recommends them via LangChain reranking.
git clone https://github.com/your-org/job-recommendation-system.git
cd job-recommendation-system
cp .env.example .env # edit values
docker compose up -d # build & startAccess Points:
- π API β http://localhost:8000/health
- ποΈ Database β auto-created (schema + migrations from data/sql/)
We provide automated development scripts that handle Docker services, code quality checks, and testing:
# Using npm script (recommended)
npm run devrun
# Or directly
./devrun.shdevrun.cmdThe devrun scripts automate your entire development workflow:
- π³ Start Docker Services - Brings up all containers (backend, frontend, databases, etc.)
- π Run Quality Checks:
- Python (Backend):
ruff- Fast Python linterblack --check- Code formatting verificationpytest- Run all tests
- Node.js (Frontend):
eslint- JavaScript/TypeScript lintingprettier --check- Code formatting verificationnext lint- Next.js specific lintingjest- Run all frontend tests
- Python (Backend):
- π Generate Summary - Shows which checks passed/failed
- π Clean Shutdown - Automatically stops Docker services when done
0- All checks passed β1- One or more checks failed β
Before running the dev scripts, ensure you have:
- Docker & Docker Compose installed
- Node.js & npm installed (for npm script)
- Executable permissions (Linux/macOS):
chmod +x devrun.sh
-
Run before committing:
npm run devrun # Ensures code quality before pushing -
Fix issues automatically (where possible):
# Python formatting docker compose exec backend black . # Node formatting docker compose exec frontend npx prettier --write .
-
Run specific checks:
# Just Python tests docker compose exec backend pytest # Just frontend linting docker compose exec frontend npx eslint .
Script exits immediately:
- Check Docker is running:
docker --version - Verify Docker Compose:
docker compose version
Permission denied (Linux/macOS):
chmod +x devrun.shChecks failing:
- Review the specific error messages in the output
- Run formatters to auto-fix:
black .orprettier --write . - Check test logs for failing tests
Services won't start:
# Clean restart
docker compose down -v
docker compose up -dThe entire stack now reads a single SERVER_ENV flag (local, staging, production) so you can branch logic with simple helpers:
- Backend (
common/server_environment.py) exposesget_server_environment()which returns booleans likeis_local,is_staging,is_prod. Both FastAPI apps (Job API + Resume Reader) import this helper so any service can branch on the same flags. - Frontend (
job-recommendation-system/front-end/lib/server/environment.ts) mirrors the same contract so API routes and pages can ask forisLocal,isStaging, etc. - Any other frontend (e.g., a future Resume Reader UI) can import from
frontend-common/environmentdirectly:
import { resolveServerEnvironment } from "../../frontend-common/environment";
const serverEnv = resolveServerEnvironment();
if (serverEnv.isLocal) {
// local-only logic
}Supporting variables (all live in .env / deployment secrets):
| Variable | Purpose | Example |
|---|---|---|
SERVER_ENV |
Active environment slug | local, staging, production |
API_BASE_URL |
Where the frontend talks to the backend | http://localhost:8000 |
FRONTEND_ORIGIN |
Primary UI origin allowed by CORS | http://localhost:3000 |
CORS_EXTRA_ORIGINS |
Optional comma list of additional origins | https://staging.example.com |
When SERVER_ENV=local, sensible defaults are applied (localhost ports). For staging/prod just set the URLs explicitlyβboth backend and frontend modules will stay in sync.
.
βββ job-recommendation-framework/ # Framework: AI & LangChain
β βββ framework/
β
βββ job-recommendation-system/ # Main system
β βββ core/ # business logic & entities
β βββ web/ # FastAPI API layer
β βββ frontend/ # React/NxT.js UI
β βββ data/sql/ # DB migrations (DDL/DML)
β βββ Major_01_00_00/ # schema
β βββ Major_02_00_00/ # future DDL
β
βββ docker/ # Docker configs
β βββ Dockerfile.api
β βββ entrypoint.api.sh
β βββ db-seed.sh
β
βββ docker-compose.yml
βββ .env.example
βββ .dockerignore
βββ Makefile # dev shortcuts
βββ README.md
| Task | Command | Description |
|---|---|---|
| Run all checks | npm run devrun |
Start services, run all quality checks, generate report |
| Start services | docker compose up -d |
Start all containers in background |
| Stop services | docker compose down |
Stop all containers |
| View logs | docker compose logs -f |
Follow logs from all services |
| Service logs | docker compose logs -f backend |
Follow logs from specific service |
| Format Python | docker compose exec backend black . |
Auto-format Python code |
| Format Node | docker compose exec frontend npx prettier --write . |
Auto-format frontend code |
| Python tests | docker compose exec backend pytest |
Run backend tests |
| Frontend tests | docker compose exec frontend npx jest |
Run frontend tests |
| Rebuild | docker compose build --no-cache |
Clean rebuild all containers |
| Database reset | docker compose down -v && docker compose up -d |
Reset database and restart |
Frontend (React/NxT.js) β login, resume upload, Q&A, jobs view
API (FastAPI) β /resume, /qa/*, /score, /jobs/recommend
Core β parsing, scoring, job recommendation
Framework β LangChain parsing assist, QGen, scoring, reranking
Job Source β LinkedIn scraper / adapter
Final Score = 0.6 Γ ResumeScore + 0.4 Γ QAScore
- < 60 β retry
- β₯ 60 β job recommendations
- LLM-based resume parsing, question generation, answer scoring, job reranking.
- Independent package β plug & play with system.
- Core resume parser (non-LLM fallback).
- Scoring logic (resume + answers).
- Job fetching (LinkedIn scraper/integrator).
- API layer (/api/v1/resumesystem/*).
- React frontend (Login, Resume upload, Q&A, Jobs view).
Backend: Python 3.9.6, FastAPI (or Flask)
Frontend: Nxt.Js + Tailwind
AI: LangChain + LLMs
DBs: PostgreSQL/MySQL, FAISS/PGVector, Redis/Elastic
Scraping: LinkedIn (with compliance checks)
Infra: Docker optional, .env configs for secrets
Final Score = 0.6 Γ Resume Score + 0.4 Γ Q&A Score
Threshold:
- < 60 β popup: "Your score is below 60"
- β₯ 60 β LinkedIn scraping + job recommendations
sequenceDiagram
autonumber
participant FE as Frontend
participant API as Web API
participant CORE as Core
participant FW as Framework
participant DB as DB
FE->>API: POST /resume (file)
API->>CORE: parse_and_normalize(uri)
CORE->>FW: LLM.extract_entities(text)
FW-->>CORE: entities
CORE->>DB: save profile
API-->>FE: profileId
FE->>API: GET /qa/start
API->>CORE: generate_questions(profile)
CORE->>FW: LLM.qgen(profile)
FW-->>CORE: 7-8 questions
CORE-->>API: questions
API-->>FE: show questions
loop For each answer
FE->>API: POST /qa/answer
API->>CORE: score_answer
CORE->>FW: LLM.score(q,a,profile)
FW-->>CORE: score
CORE->>DB: save partial score
end
FE->>API: GET /score
API->>CORE: compute_score
CORE-->>API: score
API-->>FE: final score + decision
We welcome contributions! Please see our CONTRIBUTING.md for details.
- Fork the repository
- Create a feature branch
- Follow coding standards
- Write tests for new features
- Run quality checks - Use
npm run devrunto ensure all checks pass - Submit pull request
- Python: PEP 8 compliance (enforced by
ruffandblack) - JavaScript: ESLint with standard config
- SQL: Proper indexing and constraints
- Docker: Multi-stage builds for optimization
π‘ Tip: Run
npm run devrunbefore committing to catch issues early!
# API health
curl http://localhost:8000/health
# Database health
docker compose exec mysql mysqladmin ping
# Service status
docker compose ps# View all logs
docker compose logs -f
# Service-specific logs
docker compose logs -f api
docker compose logs -f mysql
# Log levels (set in .env)
LOG_LEVEL=INFO # DEBUG, INFO, WARNING, ERRORPort conflicts:
# Check port usage
netstat -tulpn | grep :8000
# Change ports in docker-compose.ymlDatabase connection issues:
# Check MySQL status
docker compose ps mysql
# Reset database
make reset
make upBuild failures:
# Clean build
docker compose build --no-cache
# Check Docker daemon
docker info- GitHub Issues: Report bugs
- Documentation: Full docs
- Email: support@your-org.com
This project is licensed under the MIT License - see the LICENSE file for details.
Happy job hunting! π―