{"id":32992787,"url":"https://github.com/hexbyte-lab/resumatch","last_synced_at":"2026-04-29T23:03:42.543Z","repository":{"id":323934370,"uuid":"1093811190","full_name":"hexbyte-lab/resumatch","owner":"hexbyte-lab","description":"AI-powered resume-to-job matching tool with NLP analysis | Python + Flask + Machine Learning","archived":false,"fork":false,"pushed_at":"2025-11-12T21:58:18.000Z","size":347,"stargazers_count":0,"open_issues_count":0,"forks_count":0,"subscribers_count":0,"default_branch":"main","last_synced_at":"2025-11-12T23:32:35.392Z","etag":null,"topics":["cosine-similarity","flask","job-search","machine-learning","nltk","portfolio-project","python","resume","scikit-learn","tfidf"],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"mit","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/hexbyte-lab.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null,"notice":null,"maintainers":null,"copyright":null,"agents":null,"dco":null,"cla":null}},"created_at":"2025-11-10T21:49:43.000Z","updated_at":"2025-11-12T21:58:23.000Z","dependencies_parsed_at":null,"dependency_job_id":null,"html_url":"https://github.com/hexbyte-lab/resumatch","commit_stats":null,"previous_names":["hexbyte-lab/resumatch"],"tags_count":null,"template":false,"template_full_name":null,"purl":"pkg:github/hexbyte-lab/resumatch","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexbyte-lab%2Fresumatch","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexbyte-lab%2Fresumatch/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexbyte-lab%2Fresumatch/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexbyte-lab%2Fresumatch/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/hexbyte-lab","download_url":"https://codeload.github.com/hexbyte-lab/resumatch/tar.gz/refs/heads/main","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/hexbyte-lab%2Fresumatch/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":32447312,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-04-29T22:27:22.272Z","status":"ssl_error","status_checked_at":"2026-04-29T22:10:49.234Z","response_time":110,"last_error":"SSL_read: unexpected eof while reading","robots_txt_status":"success","robots_txt_updated_at":"2025-07-24T06:49:26.215Z","robots_txt_url":"https://github.com/robots.txt","online":false,"can_crawl_api":true,"host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["cosine-similarity","flask","job-search","machine-learning","nltk","portfolio-project","python","resume","scikit-learn","tfidf"],"created_at":"2025-11-13T10:00:55.951Z","updated_at":"2026-04-29T23:03:42.538Z","avatar_url":"https://github.com/hexbyte-lab.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# ResuMatch\n\nA resume-to-job-description matching tool that helps job seekers improve their resumes by analyzing match scores, identifying missing keywords, and providing actionable suggestions.\n\n## Features\n\n- **Match Score Calculation**: Get a percentage score showing how well your resume matches a job description\n- **Missing Keywords Detection**: Identify important keywords from the job posting that are missing in your resume\n- **File Upload Support**: Upload resumes in PDF, DOCX, or TXT format\n- **Flexible Input**: Choose between file upload or direct text paste\n- **Clean Web Interface**: Simple, user-friendly interface with smart form handling\n- **REST API**: Backend API for programmatic access\n\n## Screenshots\n\n### Main Interface\n![ResuMatch Interface](images/interface.png)\n\n### Analysis Results\n![Analysis Results](images/results.png)\n\n## Tech Stack\n\n- **Backend**: Python, Flask\n- **NLP**: NLTK, scikit-learn (TF-IDF vectorization)\n- **File Processing**: PyPDF2, python-docx\n- **Frontend**: HTML, CSS, JavaScript (separated for maintainability)\n- **Algorithm**: Cosine similarity for text matching\n\n## Project Structure\n```\nresumatch/\n├── app.py                      # Flask application entry point\n├── src/\n│   ├── api/\n│   │   └── routes.py           # API endpoints\n│   ├── services/\n│   │   └── matcher.py          # Core matching algorithm\n│   ├── utils/\n│   │   ├── text_processor.py   # Text cleaning and keyword extraction\n│   │   ├── file_processor.py   # PDF/DOCX file handling\n│   │   └── logger.py           # Application logging\n│   └── config.py               # Configuration settings\n├── static/\n│   ├── index.html              # Frontend HTML\n│   ├── css/\n│   │   └── styles.css          # Styling\n│   └── js/\n│       └── app.js              # Frontend logic\n├── tests/                      # Unit tests (TODO)\n├── docs/\n│   └── requirements.md         # Project requirements\n├── images/                     # Screenshots\n├── requirements.txt            # Python dependencies\n└── README.md                   # This file\n```\n\n## Setup Instructions\n\n### Prerequisites\n- Python 3.8 or higher\n- pip\n- Virtual environment (recommended)\n\n### Installation\n\n1. **Clone the repository**\n```bash\n   git clone https://github.com/hexbyte-lab/resumatch.git\n   cd resumatch\n```\n\n2. **Create and activate virtual environment**\n   \n   **Linux/Mac:**\n```bash\n   python3 -m venv venv\n   source venv/bin/activate\n```\n   \n   **Windows:**\n```bash\n   python -m venv venv\n   venv\\Scripts\\activate\n```\n\n3. **Install dependencies**\n```bash\n   pip install -r requirements.txt\n```\n\n4. **Create `.env` file** (optional, uses defaults if not present)\n```\n   DEBUG=True\n   HOST=0.0.0.0\n   PORT=5000\n```\n\n5. **Run the application**\n```bash\n   python app.py\n```\n\n6. **Open in browser**\n```\n   http://localhost:5000\n```\n\n## Usage\n\n### Web Interface\n\n1. Navigate to `http://localhost:5000`\n2. **Choose your input method:**\n   - **Option A**: Upload your resume file (PDF, DOCX, or TXT)\n   - **Option B**: Paste your resume text directly\n3. Paste the job description in the right textarea\n4. Click \"Analyze Match\"\n5. Review your match score and missing keywords\n\n**Note**: When a file is uploaded, the text input is automatically disabled to prevent confusion.\n\n### API Endpoints\n\n#### Health Check\n```bash\nGET /api/health\n```\n\n**Response:**\n```json\n{\n  \"status\": \"healthy\",\n  \"message\": \"ResuMatch API is running\"\n}\n```\n\n#### Analyze Resume from File\n```bash\nPOST /api/analyze-file\nContent-Type: multipart/form-data\n\nForm Data:\n- resume_file: PDF, DOCX, or TXT file\n- job_description: Job description text\n```\n\n**Response:**\n```json\n{\n  \"success\": true,\n  \"data\": {\n    \"match_score\": 42.15,\n    \"missing_keywords\": [\"kubernetes\", \"aws\", \"docker\"],\n    \"total_missing\": 3\n  },\n  \"resume_preview\": \"First 200 characters of extracted text...\"\n}\n```\n\n## How It Works\n\n1. **Text Preprocessing**: Both resume and job description are cleaned (lowercased, special characters removed, tokenized)\n2. **Keyword Extraction**: Important keywords are extracted using NLTK, removing common stopwords\n3. **TF-IDF Vectorization**: Texts are converted to numerical vectors using TF-IDF (Term Frequency-Inverse Document Frequency)\n4. **Cosine Similarity**: The similarity between vectors is calculated, giving a match score (0-100%)\n5. **Keyword Comparison**: Keywords in the job description that don't appear in the resume are identified as \"missing\"\n\n## Development\n\n### Running Tests\n```bash\npython -m pytest tests/\n```\n(Note: Tests are not yet implemented)\n\n### Code Structure\n- `src/api/routes.py`: Flask routes and request handling\n- `src/services/matcher.py`: Core matching logic using scikit-learn\n- `src/utils/text_processor.py`: Text cleaning and keyword extraction\n- `src/config.py`: Centralized configuration\n\n## Future Enhancements\n\n- [ ] Add unit tests\n- [ ] Generate improvement suggestions with AI\n- [ ] Save analysis history with database\n- [ ] Add user authentication\n- [ ] Deploy to cloud (Heroku/AWS)\n- [ ] Add more sophisticated NLP (BERT embeddings)\n- [ ] Support for more file formats (RTF, ODT)\n- [ ] Batch processing for multiple resumes\n\n## Contributing\n\nThis is a personal learning project, but suggestions and feedback are welcome!\n\n## License\n\nMIT License - feel free to use this project for learning purposes.\n\n## Author\n\nHexByte (Rafi)\n\n## Acknowledgments\n\n- Built following software engineering best practices\n- Uses Flask for web framework\n- NLP powered by NLTK and scikit-learn\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhexbyte-lab%2Fresumatch","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fhexbyte-lab%2Fresumatch","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fhexbyte-lab%2Fresumatch/lists"}