{"id":42756839,"url":"https://github.com/sliday/resume-job-matcher","last_synced_at":"2026-01-29T20:15:02.985Z","repository":{"id":259118859,"uuid":"861987013","full_name":"sliday/resume-job-matcher","owner":"sliday","description":"AI-powered Python script for automated resume-job matching with scoring, PDF generation, and personalized email responses.","archived":false,"fork":false,"pushed_at":"2024-11-21T17:11:59.000Z","size":72,"stargazers_count":151,"open_issues_count":0,"forks_count":17,"subscribers_count":6,"default_branch":"master","last_synced_at":"2024-11-21T18:23:10.495Z","etag":null,"topics":[],"latest_commit_sha":null,"homepage":"","language":"Python","has_issues":true,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":null,"status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/sliday.png","metadata":{"files":{"readme":"readme.md","changelog":null,"contributing":null,"funding":null,"license":null,"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}},"created_at":"2024-09-23T20:44:27.000Z","updated_at":"2024-11-21T17:12:19.000Z","dependencies_parsed_at":"2024-10-23T05:34:26.947Z","dependency_job_id":null,"html_url":"https://github.com/sliday/resume-job-matcher","commit_stats":null,"previous_names":["sliday/resume-job-matcher"],"tags_count":0,"template":false,"template_full_name":null,"purl":"pkg:github/sliday/resume-job-matcher","repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sliday%2Fresume-job-matcher","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sliday%2Fresume-job-matcher/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sliday%2Fresume-job-matcher/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sliday%2Fresume-job-matcher/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/sliday","download_url":"https://codeload.github.com/sliday/resume-job-matcher/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/sliday%2Fresume-job-matcher/sbom","scorecard":null,"host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":286080680,"owners_count":28884284,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2026-01-29T19:55:09.949Z","status":"ssl_error","status_checked_at":"2026-01-29T19:55:08.490Z","response_time":59,"last_error":"SSL_connect returned=1 errno=0 peeraddr=140.82.121.5:443 state=error: 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":[],"created_at":"2026-01-29T20:15:02.908Z","updated_at":"2026-01-29T20:15:02.979Z","avatar_url":"https://github.com/sliday.png","language":"Python","funding_links":[],"categories":[],"sub_categories":[],"readme":"# Resume Job Matcher\n\n## Overview\n\n**Resume Job Matcher** is a Python script that automates the process of matching resumes to a job description using AI. It leverages the Anthropic Claude API or OpenAI's GPT API to analyze resumes and provide a match score along with personalized email responses for candidates.\n\n![Area](https://github.com/user-attachments/assets/1fee4382-7462-4463-9cb1-61704eea218b)\n\n## Features\n\n- 🔥 **Comprehensive Resume Processing**\n  - Multiple outputs: PDF and Markdown generation\n  - Standardization for fair evaluation\n  - Font customization (sans-serif, serif, monospace)\n  - Command-line options for flexibility\n\n- 🧠 **Advanced AI-Powered Analysis**\n  - Resume-job comparison using Claude/GPT API\n  - Dual AI support with runtime selection\n  - Efficient model interaction\n  - Structured data handling with Pydantic\n\n- 📊 **In-depth Evaluation \u0026 Scoring**\n  - Smart parsing with PyPDF2\n  - Multi-factor assessment: skills, experience, education, certifications\n  - Visual and content-based quality assessment\n  - 🚩 Red flag detection in critical areas\n  ![CleanShot 2024-10-09 at 17 08 09@2x](https://github.com/user-attachments/assets/e47b57e1-521a-4b21-aeb3-975af1e0f2ed)\n  - Detailed scoring with emoji and color-coded results\n\n- 📈 **Comprehensive Analytics \u0026 Reporting**\n  - Statistical insights: top, average, median, standard deviation scores\n  - Candidate distribution summary\n  - Match analysis with improvement suggestions\n  - Job description optimization recommendations\n\n- 🌐 **Enhanced Candidate Profiling**\n  - Website integration for improved matching\n  - Personalized email generation\n\n- 🛠️ **Robust System Management**\n  - Advanced logging and error handling\n  - Improved user feedback and reliability\n\n![CleanShot 2024-09-23 at 23 02 45@2x](https://github.com/user-attachments/assets/bc789343-839e-44bc-b3fb-df3cedf869a8)\n\n## Usage\n\nTo run the script with the new features:\n\n```bash\npython resume_matcher.py [--sans-serif|--serif|--mono] [--pdf] [job_desc_file] [pdf_folder]\n```\n\n- Use `--sans-serif`, `--serif`, or `--mono` to select a font preset.\n- Use `--pdf` to generate PDF versions of unified resumes.\n- Optionally specify custom paths for the job description file and PDF folder.\n\n## Customization\n\n### Adjust Logging Level\n\nModify the logging level at the beginning of the script:\n\n```python\nlogging.basicConfig(level=logging.INFO, format='%(asctime)s - %(levelname)s - %(message)s')\n```\n\nAvailable levels: `DEBUG`, `INFO`, `WARNING`, `ERROR`, `CRITICAL`.\n\n### Change Scoring Model\n\nTo change the AI model used, update the `model` parameter in the `match_resume_to_job` function:\n\n```python\nmessage = client.messages.create(\n    model=\"claude-3-5-sonnet-20240620\",\n    ...\n)\n```\n\n### Modify AI Provider\n\nTo switch between Anthropic and OpenAI APIs, modify the `choose_api` function call at the beginning of the script:\n\n```python\ndef choose_api():\n    global chosen_api\n    prompt = \"Use OpenAI API instead of Anthropic? [y/N]: \"\n    choice = input(colored(prompt, \"cyan\")).strip().lower()\n    \n    if choice in [\"y\", \"yes\"]:\n        chosen_api = \"openai\"\n    else:\n        chosen_api = \"anthropic\"\n```\n\n### Adjust AI Model\n\nTo change the AI model used, update the `model` parameter in the `talk_fast` function:\n\n```python\nresponse = client.chat.completions.create(\n    model=\"gpt-4o\",  # Change this to the desired model\n    ...\n)\n```\n\n## Score Calculation\n\nThe final score for each resume is calculated using a combination of two factors:\n\n1. **AI-Generated Match Score (75% weight)**: This score is based on how well the resume matches the job description, considering factors such as skills, experience, education, and other relevant criteria.\n\n2. **Resume Quality Score (25% weight)**: This score assesses the visual appeal and clarity of the resume itself, including formatting, layout, and overall presentation.\n\nThe calculation process is as follows:\n\n1. The AI-generated match score and the resume quality score are both normalized to a 0-100 scale.\n2. A weighted average is calculated: \n   `(AI_Score * 0.75 + Quality_Score * 0.25)`\n3. The result is clamped to ensure it falls within the 0-100 range.\n\nThis combined approach ensures that both the content relevance and the presentation quality of the resume are taken into account in the final score.\n\n### Modify Scoring Criteria\n\nAdjust the scoring logic in the `match_resume_to_job` function's prompt as needed to better fit your specific requirements.\n\n## Troubleshooting\n\n### Common Issues\n\n- **No Resumes Found**: Ensure that resume PDFs are placed in the correct directory (`src` by default).\n- **Job Description Not Found**: Confirm that `job_description.txt` exists in the script's directory or provide the correct path.\n- **API Key Errors**: Verify that the `CLAUDE_API_KEY` environment variable is set correctly.\n- **Dependency Errors**: Install all required Python packages using `pip`.\n\n### Adjusting Timeouts and Retries\n\nIf you experience network-related errors when fetching personal websites, you may adjust the `timeout` parameter in the `check_website` function.\n\n```python\nresponse = requests.get(url, timeout=10)\n```\n\n## Best Practices\n\n- **Data Privacy**: Ensure that all candidate data is handled in compliance with relevant data protection laws and regulations.\n- **API Usage**: Be mindful of API rate limits and usage policies when using the Anthropic Claude API.\n\n## Contributing\n\nWe welcome contributions! Please follow these steps:\n\n1. **Fork the Repository**: Create your own fork on GitHub.\n2. **Create a Feature Branch**: Work on your feature or fix in a new branch.\n3. **Submit a Pull Request**: Once your changes are ready, submit a pull request for review.\n\n## Acknowledgments\n\n- **Anthropic Claude API**: For providing advanced AI capabilities.\n\n---\n\nEnjoy using the Resume Job Matcher script to streamline your recruitment process!\n\n## Python Packages\n\nThe following Python packages are required for this project:\n\n- PyPDF2: For extracting text from PDF resumes\n- anthropic: To interact with the Anthropic Claude API for AI-powered analysis\n- tqdm: For displaying progress bars during processing\n- termcolor: To add colored output in the console\n- json5: For parsing JSON-like data with added flexibility\n- requests: To make HTTP requests for fetching website content\n- beautifulsoup4: For parsing HTML content from personal websites\n- openai: To interact with the OpenAI API for AI-powered analysis\n- pydantic: For data validation and settings management using Python type annotations\n\nTo install these packages, you can use pip:\n\n```bash\npip install PyPDF2 anthropic openai tqdm termcolor json5 requests beautifulsoup4 pydantic\n```\n\n## Star History\n\n\u003ca href=\"https://star-history.com/#sliday/resume-job-matcher\u0026Date\"\u003e\n \u003cpicture\u003e\n   \u003csource media=\"(prefers-color-scheme: dark)\" srcset=\"https://api.star-history.com/svg?repos=sliday/resume-job-matcher\u0026type=Date\u0026theme=dark\" /\u003e\n   \u003csource media=\"(prefers-color-scheme: light)\" srcset=\"https://api.star-history.com/svg?repos=sliday/resume-job-matcher\u0026type=Date\" /\u003e\n   \u003cimg alt=\"Star History Chart\" src=\"https://api.star-history.com/svg?repos=sliday/resume-job-matcher\u0026type=Date\" /\u003e\n \u003c/picture\u003e\n\u003c/a\u003e\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsliday%2Fresume-job-matcher","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fsliday%2Fresume-job-matcher","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fsliday%2Fresume-job-matcher/lists"}