The $200 Problem I Solved for Free
A resume walks into an Applicant Tracking System. The ATS doesn't care about your work ethic, your ten years of experience, or the font you agonized over. It cares about keyword overlap with the job description, and it silently discards about 75% of resumes before a human ever opens one. I watched friends who were genuinely good at their jobs get filtered out without so much as a rejection email.
Naturally, the internet's answer to "the system is unfair" was to sell you a subscription. Teal, Enhancv, Kickresume, Resume Worded, all running the same playbook: put the useful features behind a paywall, dress up urgency as scarcity, and charge desperate job seekers $9 a week to $49 a month for something an API call handles in about four seconds.
So I built the version that doesn't charge rent. Free, open-source, and it does the actual job: read the posting, rewrite the resume to speak the ATS's language, and hand it back in a format a human recruiter can still read without flinching.
How It Actually Works
No magic, just a pipeline that does its job and gets out of the way:
• FastAPI backend: handles resume processing asynchronously, so the app stays responsive instead of freezing while an LLM thinks.
• Live progress over WebSockets: you see exactly what stage it's on instead of staring at a spinner and wondering if it crashed.
• AI-powered rewriting: OpenAI (with Claude and GPT support) reads the job posting and restructures your resume to mirror it, without inventing experience you don't have.
• Document pipeline: extracts your existing resume content, restructures it against the job requirements, and outputs a properly formatted document instead of a wall of keyword soup.
Why This Isn't Just Keyword Stuffing
Every other resume tool I tried focused on making things look nicer. That's not the problem. The real problem is that a modern job application has two audiences reading the same document with completely different comprehension: an algorithm scanning for exact phrase matches, and a human scanning for whether you sound like someone worth calling.
So it does the things the paid tools charge extra for, or skip entirely:
• Job posting analysis: pulls the actual signal out of a job description instead of the fluff at the top
• Resume rewriting: restructures your real experience to mirror what the posting is asking for, no fabrication
• ATS-friendly formatting: follows the unglamorous formatting rules that keep a resume machine-readable
• Tactical recommendations: tells you what's actually missing instead of a generic "add more keywords"
• Interview question generator: so you walk in having already rehearsed the questions your own resume invites
The Word "Proof" Was Doing a Lot of Unearned Work
For a long time this tool asked a language model to make resumes better and had no way to tell whether it had. Every claim it made routed through the same unfalsifiable step. "ATS-proof" was the name, not a measurement, and I'd shipped it that way.
So I built the part that can disagree with the rest of the tool. It reads your DOCX twice: once as Word renders it, and once the way a resume parser does, walking the document body in XML order. The gap between those two readings is where resumes die. A contact block sitting in the page header looks perfect on screen and is completely unreachable by a recruiter, and that's now a finding with the offending text quoted next to it, not a model's opinion.
It reports two scores and deliberately refuses to average them. Parse score asks whether an ATS can read the document at all. Match score asks how much of the posting's vocabulary is present. Collapsing those into one number hides the case that matters most: a keyword-perfect resume trapped in a two-column table scores 70 on match and 74 on parse, and the useful advice is entirely about the table. When you don't supply a job posting, match score is zero rather than a number I made up.
Measuring the Thing That Does the Measuring
A resume linter nobody has tested against known defects is a resume linter nobody has tested. So the repo generates its own corpus: resumes built from code with deliberately planted flaws, one with contact details buried in a header, one laid out in a two-column table, one with section headings like "Where I've Been" that map to no known field. The checks score 1.00 precision and 1.00 recall against them.
Precision is the number I actually care about. A linter that invents problems on a clean document teaches people to ignore it, so the clean fixture firing zero findings is the property under test. It scores 100; the broken ones average 56.8. Fixtures are generated rather than collected, so nobody's real resume is sitting in a public repository.
My first benchmark run reported precision 0.70, and the three "false positives" turned out to be correct findings I'd failed to annotate: a two-line resume genuinely has no dates and no section headings. Fixing the annotations rather than suppressing the checks is the honest direction, and the corrected numbers are the ones above. The benchmark artifact is committed and regenerated in CI so it can't quietly drift from the code.
The audit needs one dependency, python-docx, and runs entirely offline. Deciding whether a document parses is arithmetic over its own XML, so it sits behind no API key and no paywall, and a separate CI job proves it runs with nothing else installed. Every rewrite the app performs now ships a before-and-after report in the download bundle. If the rewrite lowered the parse score, the report says so.
Why I'm Giving It Away
I'm not trying to build a resume startup. I'm trying to remove one specific tax on job hunting while unemployed, which is a genuinely bad time to be asked for $49 a month.
Getting filtered out and getting called back usually comes down to whether you speak both languages: the algorithm's and the human's. This tool exists so that skill doesn't cost a subscription.