AI-powered resume analysis service built entirely with Cursor AI assistant, using local LLM (LM Studio) with intelligent block processing, skills extraction, and experience calculation.
- π§ LLM-Powered Analysis - Uses local LLM (LM Studio) for intelligent resume parsing
- π Multi-Format Support - Handles DOCX and PDF resume files
- β‘ Parallel Processing - Concurrent block processing for faster analysis
- π― Smart Skills Extraction - Deduplication and scoring of technical skills
- πΌ Experience Calculation - Automatic work experience calculation from roles
- π Multi-Language Support - Analyzes resumes in various languages
- π³ Docker Ready - Complete containerization with Docker Compose
- π§ͺ Comprehensive Testing - Unit and integration tests with unittest
- ποΈ SOLID Architecture - Clean, maintainable code following SOLID principles
- Python 3.11+
- LM Studio - Download from lmstudio.ai
- Docker (optional) - For containerized deployment
git clone https://github.com/ppush/resume-analyzer.git
cd resume-analyzerpip install -r requirements.txt- Download and install LM Studio
- Load model:
google/gemma-3-12bormeta-llama-3.1-8b-instruct - Start local server on port 1234
python run.py- Swagger UI: http://localhost:8000/docs
- Health Check: http://localhost:8000/health
- API Base: http://localhost:8000
# Build and run with Docker Compose
docker-compose up --build
# Or use the provided scripts
./docker-scripts/run.sh # Linux/macOS
.\docker-scripts\run.ps1 # Windows PowerShell# Run in development mode with live reload
docker-compose -f docker-compose.dev.yml up --build
# Or use the provided scripts
./docker-scripts/dev.sh # Linux/macOS
.\docker-scripts\dev.ps1 # Windows PowerShellUpload and analyze a resume file with intelligent structure preservation (DOCX/PDF).
Request:
curl -X POST "http://localhost:8000/analyze" \
-H "Content-Type: multipart/form-data" \
-F "file=@resume.pdf"Response:
{
"skills_from_resume": [
{"name": "Java", "score": 85},
{"name": "Spring Boot", "score": 80},
{"name": "Microservices", "score": 75}
],
"skills_merged": [
{"name": "Java", "score": 85, "merged": 2},
{"name": "Spring Boot", "score": 80, "merged": 1},
{"name": "Microservices Architecture", "score": 75, "merged": 3}
],
"roles": [
{
"title": "Senior Software Architect",
"project": "Polixis SA",
"duration": "1 year 9 months",
"score": 90,
"category": ["Engineering", "Architecture"]
}
],
"languages": [
{"language": "English", "level": "Advanced"},
{"language": "Armenian", "level": "Native"}
],
"experience": "20+ years",
"location": "Armenia",
"ready_to_remote": true,
"ready_to_trip": true
}resume-analyzer/
βββ π§ core/ # Core business logic
β βββ resume_parser.py # LLM-based resume parsing
β βββ block_processor.py # Parallel block processing
β βββ experience_calculator.py # Experience calculation
β βββ aggregation/ # Result aggregation
β β βββ resume_result_aggregator.py
β β βββ skill_merger.py
β β βββ experience_analyzer.py
β βββ prompts/ # LLM prompt templates
β βββ prompt_base.py
β βββ parsing_prompts.py
β βββ project_prompts.py
β βββ skill_prompts.py
β βββ language_prompts.py
βββ π services/ # External services
β βββ llm_client.py # LM Studio integration
β βββ file_loader.py # DOCX/PDF processing
βββ π§ͺ tests/ # Test suite
β βββ unit/ # Unit tests
β βββ integration/ # Integration tests
βββ π³ docker-scripts/ # Docker management
βββ π main.py # FastAPI application
βββ π run.py # Service runner
graph TD
A[Resume File<br/>PDF/DOCX] --> B[File Loader<br/>PyMuPDF/Mammoth]
B --> C[HTML Chunker<br/>Split into chunks]
C --> D[Resume Parser<br/>LLM Block Segmentation]
D --> E[Block Processor<br/>Parallel LLM Processing]
E --> F[Result Aggregator<br/>Skills Merging & Experience Calc]
F --> G[Final JSON<br/>Structured Data]
D --> H[5 Block Types:<br/>projects, skills, education,<br/>languages, summary]
E --> I[Concurrent Processing<br/>AsyncIO + Semaphore]
F --> J[Skills Deduplication<br/>Experience Calculation<br/>Job Recommendations]
projects- Work experience and rolesskills- Technical skills and competencieseducation- Education and certificationslanguages- Language proficiencysummary- General information and overview
# LM Studio settings
LM_STUDIO_URL=http://localhost:1234/v1/chat/completions
DEFAULT_MODEL=google/gemma-3-12b
DEFAULT_MAX_TOKENS=4096
DEFAULT_TEMPERATURE=0.0
DEFAULT_SEED=42
# Timeout settings
LLM_TIMEOUT=120
# Logging
LOG_LEVEL=INFOEdit config.py to change the LLM model:
# Available models
DEFAULT_MODEL = "google/gemma-3-12b" # Recommended
# DEFAULT_MODEL = "meta-llama-3.1-8b-instruct" # Alternative# Run complete test suite
python tests/run_all_tests.py
# Run with verbose output
python tests/run_all_tests.py -v# Unit tests
python -m unittest tests.unit.test_resume_parser -v
python -m unittest tests.unit.test_block_processor -v
python -m unittest tests.unit.test_experience_calculator -v
# Integration tests
python -m unittest tests.integration.test_full_pipeline -v# Run tests with coverage
pytest tests/ --cov=core --cov=services --cov-report=html# Format code
black .
isort .
# Lint code
flake8 .
# Type checking
mypy core/ services/make format # Format code
make lint # Lint code
make type-check # Type checking
make test # Run tests
make clean # Clean temporary files
make quality-check # Full quality checkpip install -r requirements-dev.txt- Fixed Seed:
seed=42for consistent results - Smart Temperature Control:
- Skills & Projects:
temperature=0.0(deterministic) - Summary:
temperature=0.7(creative) - Education:
temperature=1.0(maximum creativity)
- Skills & Projects:
- Parallel Processing: Concurrent block processing
- Timeout Management: 120s timeout per LLM request
- Processing Time: ~30-60 seconds per resume
- Memory Usage: ~200-300MB
- Docker Image Size: ~500MB
- Startup Time: ~10-15 seconds
# Check if LM Studio is running
curl http://localhost:1234/v1/models
# Start LM Studio and load a model# Supported formats: DOCX, PDF
# Check file size (max 10MB)
# Ensure file is not corrupted# Check Docker is running
docker version
# Rebuild containers
docker-compose down
docker-compose up --build- Application Logs:
resume_analyzer.log - Docker Logs:
docker-compose logs -f resume-analyzer - Log Level: Set via
LOG_LEVELenvironment variable
- DEVELOPMENT.md - Detailed development guide
- DOCKER.md - Docker setup and configuration
- TESTING_GUIDE.md - Testing documentation
- CONFIG.md - Configuration reference
- Fork the repository
- Create a feature branch (
git checkout -b feature/amazing-feature) - Commit your changes (
git commit -m 'Add amazing feature') - Push to the branch (
git push origin feature/amazing-feature) - Open a Pull Request
# Clone your fork
git clone https://github.com/ppush/resume-analyzer.git
# Install development dependencies
pip install -r requirements-dev.txt
# Run tests
python tests/run_all_tests.py
# Format code
black .
isort .This project is licensed under the MIT License - see the LICENSE file for details.
- Cursor AI for the AI-powered development assistant
- LM Studio for local LLM hosting
- FastAPI for the web framework
- Google Gemma and Meta Llama for the language models
- Issues: GitHub Issues
- Discussions: GitHub Discussions
- Documentation: Wiki
Made with β€οΈ for the developer community