Eliminating unjust discrimination in the job market through AI-powered resume analysis and fair candidate assessment.
JustWork is dedicated to creating a fair and bias-free job market where every individual is judged by their skills, not by bias. Our AI-powered platform provides tools and frameworks that help employers make fair hiring decisions, increase transparency, and create equal opportunities for all candidates.
- π€ AI-Powered Analysis: Advanced keyword extraction and candidate assessment using Mistral AI
- π Resume Processing: Automated PDF resume processing with vector embeddings
- π Skills Extraction: Structured keyword and skills extraction from resumes
- π Fair Assessment: Bias-free candidate evaluation and job matching
- π REST API: Complete RESTful API with interactive documentation
- π Web Interface: User-friendly Streamlit frontend for easy interaction
- π³ Docker Ready: Containerized deployment for easy scaling
Before getting started, ensure you have:
- Python 3.8+ installed
- Git for cloning the repository
- Mistral AI API Key (Get one here)
- Docker (optional, for containerized deployment)
# Clone the repository
git clone https://github.com/rayaneghilene/Justwork.git
cd Justwork
# Create virtual environment (recommended)
python3 -m venv venv
source venv/bin/activate # On Windows: venv\Scripts\activate
# Install dependencies
pip install -r requirements.txtCreate or update backend/config.json:
{
"api_key": "YOUR_MISTRAL_API_KEY",
"data_folder": "data",
"embedding_model": "all-MiniLM-L12-V2",
"keyword_model": "numind/NuExtract-tiny"
}# Start the FastAPI backend
python backend/main.py
# Or using the dedicated runner
python backend/run_server.py
# For production
python backend/run_server.py --production# Terminal 1: Start backend
python backend/main.py
# Terminal 2: Start frontend
cd frontend
streamlit run app.py- Backend API: http://localhost:8000
- API Documentation: http://localhost:8000/docs
- Frontend UI: http://localhost:8501 (if running Streamlit)
# Build and run backend only
docker build -t justwork-api .
docker run -p 8000:8000 -e API_KEY=your_mistral_api_key justwork-api# Backend only
docker-compose up --build
# With frontend
docker-compose --profile frontend up --build# 1. Copy the environment template
cp env.example .env
# 2. Edit .env with your actual API key
# Replace 'your_mistral_api_key_here' with your real Mistral API key
nano .envRequired environment variables:
API_KEY: Your Mistral AI API key (REQUIRED)DATA_FOLDER: Data storage folder (default: data)EMBEDDING_MODEL: HuggingFace embedding modelKEYWORD_MODEL: Keyword extraction model
GET / # Health check
GET /status # Detailed system statusPOST /upload-resumes # Upload PDF resumes
POST /analyze-resumes # Complete resume analysisPOST /extract-keywords # Extract structured keywords
POST /assess-candidate # Generate candidate assessmentcurl -X POST "http://localhost:8000/upload-resumes" \
-H "Content-Type: multipart/form-data" \
-F "files=@resume.pdf"curl -X POST "http://localhost:8000/analyze-resumes" \
-H "Content-Type: application/json" \
-d "{}"curl -X POST "http://localhost:8000/extract-keywords" \
-H "Content-Type: application/json" \
-d '{
"text": "Software engineer with 5 years Python experience...",
"schema": "{\"Skills\": [], \"Experience Years\": []}"
}'The Streamlit frontend provides an intuitive interface:
- Upload: Drag & drop or click to upload PDF resumes
- Analyze: Click "Analyze CV & Find Matches"
- Review: View extracted keywords and job match assessments
- Export: Download results for further processing
- π File Upload: Support for multiple PDF files
- π Progress Tracking: Real-time analysis progress
- π Interactive Results: Expandable keyword and assessment sections
- β‘ Real-time Updates: Live backend health monitoring
- π± Responsive Design: Works on desktop and mobile
{
"api_key": "your_mistral_api_key",
"data_folder": "data",
"embedding_model": "all-MiniLM-L12-V2",
"keyword_model": "numind/NuExtract-tiny"
}# Server Configuration
HOST=0.0.0.0
PORT=8000
LOG_LEVEL=info
# File Processing
MAX_FILE_SIZE_MB=10
ALLOWED_FILE_TYPES=pdf
# Caching
ENABLE_KEYWORD_CACHE=true
CACHE_TTL_SECONDS=3600Use the included setup script for easy configuration:
python setup_env.pyThis script will:
- Create environment variable templates
- Update configuration files
- Check Docker setup
- Provide deployment commands
JustWork/
βββ backend/ # FastAPI backend
β βββ app.py # FastAPI application
β βββ main.py # Application entry point
β βββ run_server.py # Production server runner
β βββ data_loader.py # PDF processing and embeddings
β βββ keyword_extractor.py # AI keyword extraction
β βββ llm_chain.py # LLM integration
β βββ models.py # Pydantic models
β βββ config.json # Configuration file
βββ frontend/ # Streamlit frontend
β βββ app.py # Main Streamlit app
β βββ README.md # Frontend documentation
βββ data/ # Uploaded resumes storage
βββ logs/ # Application logs
βββ docker-compose.yml # Multi-service deployment
βββ Dockerfile # Backend container
βββ Dockerfile.frontend # Frontend container
βββ requirements.txt # Python dependencies
βββ setup_env.py # Environment setup helper
βββ DEPLOYMENT.md # Detailed deployment guide
βββ README.md # This file
# Check if port 8000 is in use
lsof -i :8000
# Verify API key configuration
cat backend/config.json
# Check dependencies
pip list | grep fastapi# Check file permissions
ls -la data/
# Verify file size (must be < 10MB by default)
ls -lh your-resume.pdf
# Check backend logs
tail -f backend.log# Clear model cache
rm -rf ~/.cache/huggingface/
# Check internet connection for model downloads
ping huggingface.co
# Verify disk space for model storage
df -h# Check Docker status
docker ps
# View container logs
docker logs justwork-backend
# Rebuild containers
docker-compose down && docker-compose up --build# Check if .env file exists and contains API_KEY
cat .env | grep API_KEY
# Verify environment variable is loaded
echo $API_KEY
# For Docker: check if .env is in same directory as docker-compose.yml
ls -la .env docker-compose.yml# Make sure .env is in project root
cp env.example .env
# Check Docker Compose reads .env correctly
docker-compose config
# Restart containers after .env changes
docker-compose down && docker-compose up- First Request: May be slower due to model loading (this is normal)
- Memory Usage: Monitor with large PDF files
- Caching: Enable keyword caching for better performance
- Model Selection: Consider smaller models for faster inference
- Use
python backend/main.pyfor development - Automatic reload enabled
- Ideal for testing and development
- Use
python backend/run_server.py --production - Optimized for production workloads
- Better error handling and logging
- Single service:
docker-compose up - Full stack:
docker-compose --profile frontend up - Scalable and portable
- Supabase: See
DEPLOYMENT.mdfor detailed instructions - AWS/GCP/Azure: Use Docker containers
- Heroku: Git-based deployment ready
Candidate Assessment:
Based on the information provided, this candidate has a strong skillset in machine learning,
with expertise in various algorithms, modeling techniques, and tools. Their current position
as a Senior Data Scientist demonstrates their ability to apply these skills professionally.
Strengths:
- Proficient in machine learning techniques (regression, recommender systems, time series)
- Strong background in Python and SQL
- Experience with cloud platforms (Google Cloud Platform)
- Familiar with various databases (BigQuery, MySQL, ClickHouse, PostgreSQL)
Job Suitability:
Given the candidate's strong background in machine learning and data science, they appear
well-suited for roles involving data analysis, modeling, and machine learning engineering.
- Never commit
.envfiles or API keys to version control - Use
env.exampleas a template for required variables - Store sensitive data in environment variables, not config files
- Regularly rotate API keys and access tokens
- Use secrets management systems (AWS Secrets Manager, Azure Key Vault, etc.)
- Enable HTTPS/TLS for all API endpoints
- Implement rate limiting and request validation
- Monitor for suspicious API usage patterns
# Good: Using environment variables
export API_KEY="your-secure-api-key"
# Bad: Hardcoding in files
api_key = "hardcoded-key-in-source" # DON'T DO THIS- Use multi-stage builds to reduce attack surface
- Run containers as non-root users when possible
- Scan images for vulnerabilities regularly
- Use Docker secrets for sensitive data in swarm mode
We welcome contributions to enhance JustWork! Here's how you can help:
- Fork the repository
- Create a feature branch:
git checkout -b feature/amazing-feature - Commit changes:
git commit -m 'Add amazing feature' - Push to branch:
git push origin feature/amazing-feature - Open a Pull Request
- Follow PEP 8 style guidelines
- Add tests for new features
- Update documentation as needed
- Ensure Docker builds work
- Test both frontend and backend changes
This project is licensed under the MIT License - see the LICENSE file for details.
For questions, issues, or feedback:
- Email: rayane.ghilene@ensea.fr
- Issues: Open a GitHub issue
- Documentation: Check
DEPLOYMENT.mdfor detailed guides
Our vision is a global job market where talent is recognized without prejudice, and workplaces reflect the richness of human diversity. Through AI-powered fair hiring practices, we're building a future where every candidate has an equal opportunity to showcase their skills and potential.
Made with β€οΈ for fair hiring and equal opportunities