base on Improve your resumes with Resume Matcher. Get insights, keyword suggestions and tune your resumes to job descriptions. <div align="center"> [![Resume Matcher](assets/header.png)](https://www.resumematcher.fyi) # Resume Matcher [π™Ήπš˜πš’πš— π™³πš’πšœπšŒπš˜πš›πš](https://dsc.gg/resume-matcher) ✦ [πš†πšŽπš‹πšœπš’πšπšŽ](https://resumematcher.fyi) ✦ [π™·πš˜πš  𝚝𝚘 π™Έπš—πšœπšπšŠπš•πš•](https://resumematcher.fyi/docs/installation) ✦ [π™²πš˜πš—πšπš›πš’πš‹πšžπšπš˜πš›πšœ](#contributors) ✦ [π™³πš˜πš—πšŠπšπšŽ](#support-the-development-by-donating) ✦ [πšƒπš πš’πšπšπšŽπš›/πš‡](https://twitter.com/srbhrai) ✦ [π™»πš’πš—πš”πšŽπšπ™Έπš—](https://www.linkedin.com/company/resume-matcher/) Create tailored resumes for each job application with AI-powered suggestions. Works locally with Ollama or connect to your favorite LLM provider via API. ![Resume Matcher Demo](assets/Resume_Matcher_Demo_2.gif) </div> <br> <div align="center"> ![Stars](https://img.shields.io/github/stars/srbhr/Resume-Matcher?labelColor=F0F0E8&style=for-the-badge&color=1d4ed8) ![Apache 2.0](https://img.shields.io/github/license/srbhr/Resume-Matcher?labelColor=F0F0E8&style=for-the-badge&color=1d4ed8) ![Forks](https://img.shields.io/github/forks/srbhr/Resume-Matcher?labelColor=F0F0E8&style=for-the-badge&color=1d4ed8) ![version](https://img.shields.io/badge/Version-1.0%20Aerodynamic%20-FFF?labelColor=F0F0E8&style=for-the-badge&color=1d4ed8) [![Discord](https://img.shields.io/discord/1122069176962531400?labelColor=F0F0E8&logo=discord&logoColor=1d4ed8&style=for-the-badge&color=1d4ed8)](https://dsc.gg/resume-matcher) [![Website](https://img.shields.io/badge/website-Resume%20Matcher-FFF?labelColor=F0F0E8&style=for-the-badge&color=1d4ed8)](https://resumematcher.fyi) [![LinkedIn](https://img.shields.io/badge/LinkedIn-Resume%20Matcher-FFF?labelColor=F0F0E8&logo=LinkedIn&style=for-the-badge&color=1d4ed8)](https://www.linkedin.com/company/resume-matcher/) <a href="https://trendshift.io/repositories/565" target="_blank"><img src="https://trendshift.io/api/badge/repositories/565" alt="srbhr%2FResume-Matcher | Trendshift" style="width: 250px; height: 55px;" width="250" height="55"/></a> ![Vercel OSS Program](https://vercel.com/oss/program-badge.svg) </div> > \[!IMPORTANT] > > This project is in active development. New features are being added continuously, and we welcome contributions from the community. If you have any suggestions or feature requests, please feel free to open an issue on GitHub or discuss it on our [Discord](https://dsc.gg/resume-matcher) server. ## Getting Started Resume Matcher works by creating a master resume that you can use to tailor for each job application. Installation instructions here: [How to Install](#how-to-install) ### How It Works 1. **Upload** your master resume (PDF or DOCX) 2. **Paste** a job description you're targeting 3. **Review** AI-generated improvements and tailored content 4. **Cover Letter & Email** generator for the job application 5. **Customize** the layout and sections to fit your style 6. **Export** as a professional PDF with your preferred template ### Stay Connected [![Discord](assets/resume_matcher_discord.png)](https://dsc.gg/resume-matcher) Join our [Discord](https://dsc.gg/resume-matcher) for discussions, feature requests, and community support. [![LinkedIn](assets/resume_matcher_linkedin.png)](https://www.linkedin.com/company/resume-matcher/) Follow us on [LinkedIn](https://www.linkedin.com/company/resume-matcher/) for updates. ![Star Resume Matcher](assets/star_resume_matcher.png) Star the repo to support development and get notified of new releases. ## Sponsors ![sponsors](assets/sponsors.png) We are grateful to our sponsors who help keep this project going. If you find Resume Matcher helpful, please consider [**supporting us**](https://github.com/sponsors/srbhr) to ensure continued development and improvements. | Sponsor | Description | |---------|-------------| | [APIDECK](https://apideck.com?utm_source=resumematcher&utm_medium=github&utm_campaign=sponsors) | One API to connect your app to 200+ SaaS platforms (accounting, HRIS, CRM, file storage). Build integrations once, not 50 times. 🌐 [apideck.com](https://apideck.com?utm_source=resumematcher&utm_medium=github&utm_campaign=sponsors) | ## Support the Development by Donating ![donate](assets/supporting_resume_matcher.png) If you would like to support the development of Resume Matcher, you can do so by donating. Your contributions will help us keep the project alive and continue adding new features. | Platform | Link | |-----------|----------------------------------------| | GitHub | [![GitHub Sponsors](https://img.shields.io/github/sponsors/srbhr?style=for-the-badge&color=1d4ed8&labelColor=F0F0E8&logo=github&logoColor=black)](https://github.com/sponsors/srbhr) | | Buy Me a Coffee | [![BuyMeACoffee](https://img.shields.io/badge/Buy%20Me%20a%20Coffee-ffdd00?style=for-the-badge&logo=buy-me-a-coffee&color=1d4ed8&labelColor=F0F0E8&logoColor=black)](https://www.buymeacoffee.com/srbhr) | ## Key Features ![resume_matcher_features](assets/features.png) ### Core Features **Master Resume**: Create a comprehensive master resume to draw from your existing one. ![Job Description Input](assets/step_2.png) ### Resume Builder ![Resume Builder](assets/step_5.png) Paste in a job description and get AI-powered resume tailored for that specific role. You can: - Modify suggested content - Add/remove sections - Rearrange sections via drag-and-drop - Choose from multiple resume templates ### Cover Letter & Email Generator Generate tailored cover letters and email templates based on the job description and your resume. ![Cover Letter](assets/cover_letter.png) ### Resume Scoring (In development feature) We are working on a resume scoring feature that will analyze your resume against the job description and provide a match score along with suggestions for improvement. ![Resume Scoring and Keyword Highlight](assets/keyword_highlighter.png) ### PDF Export Export your tailored resume and cover letter in PDF. ### Templates | Template Name | Preview | Description | |---------------|---------|-------------| | **Classic Single Column** | ![Classic Template](assets/pdf-templates/single-column.jpg) | A traditional and clean layout suitable for most industries. [π•π’πžπ° 𝐏𝐃𝐅](assets/pdf-templates/single-column.pdf) | | **Modern Single Column** | ![Modern Template](assets/pdf-templates/modern-single-column.jpg) | A contemporary design with a focus on readability and aesthetics. [π•π’πžπ° 𝐏𝐃𝐅](assets/pdf-templates/modern-single-column.pdf)| | **Classic Two Column** | ![Classic Two Column Template](assets/pdf-templates/two-column.jpg) | A structured layout that separates sections for clarity. [π•π’πžπ° 𝐏𝐃𝐅](assets/pdf-templates/two-column.pdf)| | **Modern Two Column** | ![Modern Two Column Template](assets/pdf-templates/modern-two-column.jpg) | A sleek design that utilizes two columns for better organization. [π•π’πžπ° 𝐏𝐃𝐅](assets/pdf-templates/modern-two-column.pdf)| ### Internationalization - **Multi-Language UI**: Interface available in English, Spanish, Chinese, and Japanese - **Multi-Language Content**: Generate resumes and cover letters in your preferred language ### Roadmap If you have any suggestions or feature requests, please feel free to open an issue on GitHub or discuss it on our [Discord](https://dsc.gg/resume-matcher) server. - Visual keyword highlighting - AI Canvas for crafting impactful, metric-driven resume content - Multi-job description optimization ## How to Install ![Installation](assets/how_to_install_resumematcher.png) For detailed setup instructions, see the **[SETUP.md](SETUP.md)** guide. ### Prerequisites | Tool | Version | Installation | |------|---------|--------------| | Python | 3.13+ | [python.org](https://python.org) | | Node.js | 22+ | [nodejs.org](https://nodejs.org) | | uv | Latest | [astral.sh/uv](https://docs.astral.sh/uv/getting-started/installation/) | ### Quick Start Fastest for MacOS, WSL and Ubuntu users: ```bash # Clone the repository git clone https://github.com/srbhr/Resume-Matcher.git cd Resume-Matcher # Backend (Terminal 1) cd apps/backend cp .env.example .env # Configure your AI provider uv sync # Install dependencies uv run uvicorn app.main:app --reload --port 8000 # Frontend (Terminal 2) cd apps/frontend npm install npm run dev ``` Open **<http://localhost:3000>** and configure your AI provider in Settings. ### Supported AI Providers | Provider | Local/Cloud | Notes | |----------|-------------|-------| | **Ollama** | Local | Free, runs on your machine | | **OpenAI** | Cloud | GPT-4o, GPT-4o-mini | | **Anthropic** | Cloud | Claude 3.5 Sonnet | | **Google Gemini** | Cloud | Gemini 1.5 Flash/Pro | | **OpenRouter** | Cloud | Access to multiple models | | **DeepSeek** | Cloud | DeepSeek Chat | ### Docker Deployment ```bash docker pull srbhr/resume-matcher:latest docker run srbhr/resume-matcher:latest ``` See [docs/agent/60-docker/docker.md](docs/agent/60-docker/docker.md) for detailed Docker instructions. > **Using Ollama with Docker?** See [docs/agent/60-docker/docker-ollama.md](docs/agent/60-docker/docker-ollama.md) for setup instructions. TL;DR: Use `http://host.docker.internal:11434` as the Ollama URL instead of `localhost`. ### Tech Stack | Component | Technology | |-----------|------------| | Backend | FastAPI, Python 3.13+, LiteLLM | | Frontend | Next.js 15, React 19, TypeScript | | Database | TinyDB (JSON file storage) | | Styling | Tailwind CSS 4, Swiss International Style | | PDF | Headless Chromium via Playwright | ## Join Us and Contribute ![how to contribute](assets/how_to_contribute.png) We welcome contributions from everyone! Whether you're a developer, designer, or just someone who wants to help out. All the contributors are listed in the [about page](https://resumematcher.fyi/about) on our website and on the GitHub Readme here. Check out the roadmap if you would like to work on the features that are planned for the future. If you have any suggestions or feature requests, please feel free to open an issue on GitHub and discuss it on our [Discord](https://dsc.gg/resume-matcher) server. ## Contributors ![Contributors](assets/contributors.png) <a href="https://github.com/srbhr/Resume-Matcher/graphs/contributors"> <img src="https://contrib.rocks/image?repo=srbhr/Resume-Matcher" /> </a> <br/> <details> <summary><kbd>Star History</kbd></summary> <picture> <source media="(prefers-color-scheme: dark)" srcset="https://api.star-history.com/svg?repos=srbhr/resume-matcher&theme=dark&type=Date"> <img width="100%" src="https://api.star-history.com/svg?repos=srbhr/resume-matcher&theme=dark&type=Date"> </picture> </details> ## Resume Matcher is a part of [Vercel Open Source Program](https://vercel.com/oss) ![Vercel OSS Program](https://vercel.com/oss/program-badge.svg) ", Assign "at most 3 tags" to the expected json: {"id":"565","tags":[]} "only from the tags list I provide: [{"id":77,"name":"3d"},{"id":89,"name":"agent"},{"id":17,"name":"ai"},{"id":54,"name":"algorithm"},{"id":24,"name":"api"},{"id":44,"name":"authentication"},{"id":3,"name":"aws"},{"id":27,"name":"backend"},{"id":60,"name":"benchmark"},{"id":72,"name":"best-practices"},{"id":39,"name":"bitcoin"},{"id":37,"name":"blockchain"},{"id":1,"name":"blog"},{"id":45,"name":"bundler"},{"id":58,"name":"cache"},{"id":21,"name":"chat"},{"id":49,"name":"cicd"},{"id":4,"name":"cli"},{"id":64,"name":"cloud-native"},{"id":48,"name":"cms"},{"id":61,"name":"compiler"},{"id":68,"name":"containerization"},{"id":92,"name":"crm"},{"id":34,"name":"data"},{"id":47,"name":"database"},{"id":8,"name":"declarative-gui "},{"id":9,"name":"deploy-tool"},{"id":53,"name":"desktop-app"},{"id":6,"name":"dev-exp-lib"},{"id":59,"name":"dev-tool"},{"id":13,"name":"ecommerce"},{"id":26,"name":"editor"},{"id":66,"name":"emulator"},{"id":62,"name":"filesystem"},{"id":80,"name":"finance"},{"id":15,"name":"firmware"},{"id":73,"name":"for-fun"},{"id":2,"name":"framework"},{"id":11,"name":"frontend"},{"id":22,"name":"game"},{"id":81,"name":"game-engine "},{"id":23,"name":"graphql"},{"id":84,"name":"gui"},{"id":91,"name":"http"},{"id":5,"name":"http-client"},{"id":51,"name":"iac"},{"id":30,"name":"ide"},{"id":78,"name":"iot"},{"id":40,"name":"json"},{"id":83,"name":"julian"},{"id":38,"name":"k8s"},{"id":31,"name":"language"},{"id":10,"name":"learning-resource"},{"id":33,"name":"lib"},{"id":41,"name":"linter"},{"id":28,"name":"lms"},{"id":16,"name":"logging"},{"id":76,"name":"low-code"},{"id":90,"name":"message-queue"},{"id":42,"name":"mobile-app"},{"id":18,"name":"monitoring"},{"id":36,"name":"networking"},{"id":7,"name":"node-version"},{"id":55,"name":"nosql"},{"id":57,"name":"observability"},{"id":46,"name":"orm"},{"id":52,"name":"os"},{"id":14,"name":"parser"},{"id":74,"name":"react"},{"id":82,"name":"real-time"},{"id":56,"name":"robot"},{"id":65,"name":"runtime"},{"id":32,"name":"sdk"},{"id":71,"name":"search"},{"id":63,"name":"secrets"},{"id":25,"name":"security"},{"id":85,"name":"server"},{"id":86,"name":"serverless"},{"id":70,"name":"storage"},{"id":75,"name":"system-design"},{"id":79,"name":"terminal"},{"id":29,"name":"testing"},{"id":12,"name":"ui"},{"id":50,"name":"ux"},{"id":88,"name":"video"},{"id":20,"name":"web-app"},{"id":35,"name":"web-server"},{"id":43,"name":"webassembly"},{"id":69,"name":"workflow"},{"id":87,"name":"yaml"}]" returns me the "expected json"