Cover letter
A short letter, 100–150 words, written from your resume for the specific job. The prompt tells the model not to invent anything that isn't in your resume. Edit it beside the print layout, then save, regenerate or download it as a PDF.
Everything Resume Matcher does, in the order you'll use it. Paste a job description, review every change the AI proposes, polish the resume in the builder, write the cover letter and track the application. On your own machine, with the AI model you choose.
Connect an AI model. In Settings: a cloud provider with your own API key, or a local model.
Add a master resume. Upload a PDF or Word file, or build one with the Resume Wizard.
Paste a job description. The AI proposes targeted edits to your master resume.
Review the changes. In a before-and-after preview, then confirm or regenerate.
Polish it in the builder. Pick a template, adjust the layout, edit anything.
Generate the extras. A cover letter, an outreach message and interview prep for the same job.
Download. The resume and the cover letter, as PDFs.
Track the application. On a Kanban board. Confirming a tailored resume adds its card for you.
Tailoring rewords what's already in your resume. It doesn't invent experience, and nothing is saved until you've read the changes and confirmed them.
A master resume is your complete, untailored resume: every job, project and skill in one place. Upload a PDF, DOC or DOCX file up to 4 MB and the AI turns it into structured sections you can edit, keeping a copy of the original text. Scanned, image-only PDFs have no text layer and are rejected; run them through OCR first.
No resume file? The Resume Wizard asks one question at a time, at most 15, and builds the resume in a live draft as you answer. It's instructed never to invent employers, titles, dates, degrees, certifications, metrics, tools or skills.
Keep up to five master resumes as career tracks, say one for backend roles and one for ML. Exactly one is the default, and the Tailor page starts from it.
Pick how hard to tailor, paste the posting (up to 100,000 characters) and click Generate Tailored Resume.
The AI extracts the company, role, required and preferred skills, key responsibilities and keywords. They're saved with the job, which is how the tracker card later gets its company and role without another AI call.
The AI scores each bullet point for relevance to the job. It only scores; it can't rewrite or invent bullets. Code then keeps up to three bullets per job or project and checks, by actually rendering the page, that the resume fits on one page.
The AI proposes which skills to emphasise. Code accepts a skill only if it's already in your resume, appears in your resume's text, or is a required or preferred skill that appears word for word in the job description.
Instead of rewriting your whole resume, the AI returns a list of specific edits, each quoting the original text it replaces. Code verifies every quote against your resume and rejects edits aimed at protected fields.
Code restores your personal details and dates, keeps every original skill, removes a list of overused "AI-sounding" phrases (unless the job description uses them), and reverts any rewritten line that introduces a number your original doesn't contain.
The whole run has a time limit, four minutes by default, so a slow model can't hang the app.
The preview shows:
Confirm & Save keeps the result; Reject & Regenerate discards it and tries again. The decision covers the whole preview. Guardrails stop invented numbers, employers and dates, but wording can still overstate your role. Read every change: you're the final check.
When you confirm, the tailored resume is saved as a new resume titled "Role @ Company", linked to its master and its job. Its card lands in the Applied column of the tracker, and if you switched them on in Settings, a cover letter, an outreach message and interview prep are generated with it. Everything stays editable in the builder.
While the preview is open, an ATS Score Breakdown card appears under the form. It's a weighted heuristic: 55% keyword match, 25% coverage of the job's required and preferred skills, and 20% section completeness. It isn't a simulation of any real applicant tracking system, and it isn't saved.
Tailoring is designed to reword, not to invent. These rules are enforced in code, not just requested in the prompt.
Reword your summary and bullet points using the job's language
Reorder and emphasise skills
Choose which bullets to keep, up to three per entry
Add a skill the job requires, if it appears word for word in the job description (flagged as high risk)
Change your name, email, phone, location or links
Change employers, job titles or dates
Change schools, degrees or education dates
Add a number, percentage or metric that isn't in your original
Remove your existing skills, certifications, languages or awards
Add new jobs, schools or projects
Touch your custom sections
Every resume, master or tailored, opens in the builder: an editor on the left and a live, paginated preview on the right, with tabs for the resume, cover letter, outreach mail, interview prep and, on tailored resumes, JD Match.
Single Column
1 column
Two Column
2 columns
Modern
1 column, accent colour
Modern Two Column
2 columns, accent colour
LaTeX
1 column
Clean
1 column
Vivid
2 columns, accent colour
Two-column templates keep the main content first in the reading order, so text extractors read your experience before the sidebar.
On a tailored resume, the JD Match tab puts the job description next to your resume and highlights, in yellow, every job-description keyword your resume already contains.
The match rate is plain arithmetic, with no AI involved:
Take the words in the job description, drop common English words and job-posting filler (such as "team", "role" and "experience"), and keep words of three or more letters.
Do the same for your resume.
Match rate = job-description keywords found in your resume ÷ all job-description keywords.
It shows green at 50% or more, amber from 30%, and red below 30%. Because it counts every meaningful word in the posting, company background included, a strong resume often lands in the 30–50% range. Use it to spot missing skills and terms, not as a pass mark. It currently counts plain a–z words only, so accented words and Chinese, Japanese or Korean text aren't counted.
Each is written from your resume for the same job. Generate them on demand from the builder's tabs, or switch them on in Settings to have them made every time you confirm a tailored resume.
A short letter, 100–150 words, written from your resume for the specific job. The prompt tells the model not to invent anything that isn't in your resume. Edit it beside the print layout, then save, regenerate or download it as a PDF.
A 70–100 word cold email or LinkedIn message for the same job, written from your resume. Edit it, regenerate it and copy it to your clipboard. Its prompt, like the cover letter's, can be replaced with your own in Settings.
Open your master resume and click Enhance Resume. The AI looks for thin experience and project entries and asks you up to six questions about them. From your answers it writes two to four new bullet points per item, which you review before clicking Add to Resume. It only uses details you provide; it doesn't invent metrics.
In the builder, choose the experience entries, projects or skills to rework and write an instruction such as "use stronger action verbs" or "emphasise leadership". You get a before-and-after preview before anything is applied. The prompt forbids new facts, metrics, dates, companies, titles or accomplishments.
The tracker is a Kanban board for your job search. Every tailored resume you confirm gets a card automatically, and you can add cards by hand for jobs you haven't tailored for yet.
Click a card to read the full job description, keep notes, and open the exact resume you applied with: Edit Resume takes you to the builder. If that resume has since been deleted, the card still opens and tells you.
Click Add Application, choose a resume, paste the job description and pick a starting stage, such as Saved for a job you plan to tailor for later. Company and role are optional: leave them blank and the AI extracts them from the job description.
Resume Matcher doesn't include an AI model. You connect one, in the cloud or on your own machine, and the app handles the prompts, checks and formatting.
| Provider | Default model | Runs |
|---|---|---|
| OpenAI | gpt-5-nano-2025-08-07 | Cloud |
| Anthropic (Claude) | claude-haiku-4-5-20251001 | Cloud |
| Google Gemini | gemini-3-flash-preview | Cloud |
| DeepSeek | deepseek-chat | Cloud |
| OpenRouter | deepseek/deepseek-chat | Cloud |
| Groq | llama-3.3-70b-versatile | Cloud |
| Azure AI Foundry | mistral-large-latest | Cloud |
| Ollama | gemma3:4b | Your machine |
| OpenAI-compatible server (llama.cpp, vLLM, LM Studio) | You type it | Your machine |
You can type any model name your provider offers. There's no official minimum model, but small models can struggle with the structured edit format the tailoring step uses.
Set it up in Settings (provider, model, API key and, for a proxy or local server, a base URL; Save, then Test Connection), or with environment variables in apps/backend/.env or your Docker environment: LLM_PROVIDER, LLM_MODEL, LLM_API_KEY and, if needed, LLM_API_BASE. Provider names are lowercase (anthropic, ollama). Settings saved in the app take precedence over environment variables.
{job_description}, {resume_data} and {output_language} placeholders.API keys entered in Settings are stored encrypted. Each provider keeps its own key, so switching providers doesn't erase the other one.
English, Spanish, Chinese (Simplified), Japanese, Brazilian Portuguese, French and Korean. The UI language changes the interface; the content language is the one the AI writes in, for tailored resumes, cover letters, outreach messages and interview prep. They're set separately, so you can use the interface in English and write a resume in Japanese. PDFs include Noto Sans fonts for Chinese, Japanese and Korean text.
Resumes and cover letters export as PDF. The app opens a headless Chromium on a print-only version of your resume and prints it, so the PDF contains real text that can be selected, copied and read by software. Headings are real headings, two-column layouts keep the main content first in the reading order, and the page matches the builder: template, fonts, spacing and page size.
Export needs the frontend running. Locally, install Playwright's Chromium (uv run playwright install chromium) or have Chrome or Edge installed; the Docker image includes everything.
Everything lives in one folder, apps/backend/data/, or the Docker volume: resume_matcher.db, an SQLite database with your resumes, job descriptions, tailored versions and tracker board; config.json for non-secret settings; and your API keys, encrypted at rest with a secret key file readable only by your user account.
Only the AI requests you trigger leave your machine, sent to the provider you chose. With a cloud provider, that includes your resume, contact details and all, and the job description. The app contains no analytics or tracking code. At startup, the AI library (LiteLLM) fetches a public model price list; that request carries none of your data. Use Ollama or another local model server, and your resume, the job descriptions and every AI output stay on your computer.
Docker is fastest. Resume Matcher ships as a single container image on Docker Hub, where it's a Docker-Sponsored Open Source image, and on GitHub Container Registry, both built for linux/amd64 and linux/arm64. Then open http://localhost:3000/settings to connect a model.
The resume-data volume holds your database and settings, so your data survives container upgrades. Pin a version (for example :1.3.0) for repeatable deployments. To run it from source instead, you need Python 3.13+, Node.js 22+, npm and uv.
Terminal
$ docker run --name resume-matcher -p 3000:3000 \ -v resume-data:/app/backend/data \ srbhr/resume-matcher:latest It isn't a hosted website. You run it yourself, locally or in Docker. It's built for one user.
It doesn't apply for jobs or connect to job boards or employers' systems. The tracker is your own record.
It isn't an ATS checker. Its scores are keyword and section heuristics, not predictions of how any employer's software will rank you.
It doesn't write a resume from nothing. It works from your uploaded resume or your answers in the wizard.
It doesn't read scanned PDFs. Files need a text layer.
It exports PDF only. Word files are accepted as input, not output.
Backend, frontend, SRE or ML: paste the job you want next and send a resume that speaks its stack. Free, open source, and it runs on your machine.