Featured Project
ResuMatch
A posting says k8s. Your resume says Kubernetes. A human makes the connection instantly; the keyword filter sitting in front of that human does not, and you never hear back. ResuMatch resolves both to one canonical skill so the match is right, then tells you the wording diverged, which is the part you can actually act on.
166
Canonical skills, hand-written so the table stays auditable
38/38
Benchmark cases across matching and whole-document parsing
0
Model calls needed for the score, since the demo below runs offline
The problem
“78% match” from a language model is unfalsifiable. You cannot check it, argue with it, or act on it, and it will give you a different number on Tuesday. Meanwhile the thing that actually costs you the interview, that the posting’s exact word is missing from your resume, goes unmentioned.
What I built
A matcher where every point is earned weight over total weight, and each unit of weight belongs to a named requirement with the evidence that satisfied it. If it says 53%, you can see exactly which nine of seventeen points landed and why. A model is used, but only for narrow, checkable questions, never for the number.
Try it
The whole matcher is ported to TypeScript and runs in this page. Paste a real posting and your real resume. Nothing is uploaded, and there is no server to upload it to.
Nothing leaves your browser.
Paste both documents, or load the worked example, to see the match.
How it decides
Parsing
Importance comes from the heading a line sits under, because that is how postings encode it: everything under Nice to have is optional however it is phrased. A bullet is never a heading, so • Strong Python required stays a requirement instead of reading as a section label. Wrapped lines rejoin, so one bullet is one requirement rather than two, the second a fragment naming nothing.
Matching
Literal agreement first, then the alias table, resolved per skill. It also reads and versus or: “Docker and Kubernetes” is not satisfied by Docker alone, while “React or TypeScript” is satisfied by either.
What it refuses to score
A requirement naming no skill, such as “4+ years of backend experience”, has nothing to check against. Counting those as misses would deflate the score with things the tool never assessed, so they are listed separately for a human. An honest 53% over what was checkable beats a confident 39% that counted unanswerable questions as failures.
What this does not do. It scores keyword and requirement coverage, not whether you are a good candidate. No model can tell you that from two documents. The vocabulary is 166 hand-written skills, so anything outside it falls through to the semantic pass, which is off in this demo because it needs an API key. Treat a low score as a prompt to check your wording, not as a verdict.