DEV Community

Akshin Yolcuyev
Akshin Yolcuyev

Posted on

I built an AI resume tool that refuses to invent experience — here's why and how

Every AI resume tool has the same dirty little secret: to make your CV look impressive, it makes things up.

I noticed this the hard way during my own job hunt. I'd paste my resume into an LLM, ask it to tailor it for a role, and get back beautiful bullet points describing accomplishments I'd never had. It was persuasive. It was also a trap — the kind that gets you into an interview you then can't survive, because you can't speak to work you never did.

So when I built AdaptMyCV (adaptmycv.app), I started from a constraint instead of a feature: it is not allowed to invent anything. This post is about why that's harder than it sounds, and how I enforced it.

The real problem: ATS filtering rewards tailoring, not lying

Most mid-to-large employers run resumes through an Applicant Tracking System before a human sees them. If your CV doesn't reflect the language and requirements of the specific posting, you're filtered out silently — no rejection email, just nothing.

The honest fix is tailoring: surfacing the experience you actually have that's relevant to this role, and mirroring the posting's terminology. The dishonest fix is fabrication: adding skills and results you don't have because they match the keywords. Both get you past the filter. Only one survives the interview.

The whole product is an attempt to do the first and structurally prevent the second.

How the pipeline works

Four stages, two models:

  1. Parse — the uploaded CV (PDF/DOCX) is parsed into structured JSON: experience, skills, education, each with provenance back to the source text.
  2. Gap analysis — the job description is compared against that structured CV to find genuine overlaps and genuine gaps.
  3. Adapt — the rewrite step is constrained: it may re-emphasize, re-order, and re-word existing experience to match the role, but every claim must trace to something already in the parsed CV.
  4. Render — a clean, ATS-parseable PDF (WeasyPrint), because a great rewrite trapped in unparseable formatting is useless.

The honesty check

The interesting part is stage 3's guardrail. After the adapt step, a second pass compares the rewritten CV against the original parsed CV and flags any statement that isn't supported by the source. A new job title, a metric that appeared from nowhere, a skill never mentioned — all get surfaced rather than silently shipped.

It's not perfect (LLMs are fuzzy, and "supported by" is a judgment call), but the default is inverted from the rest of the market: when in doubt, don't add it. The cost of a false "that's invented" flag is a small annoyance. The cost of a confident fabrication is a candidate humiliated in an interview.

A few engineering notes

  • Two-tier models: a cheaper model for parse/gap/scoring, the flagship only for the actual rewrite. Keeps per-adaptation cost around a few cents.
  • Preview before payment: you run and see the full tailored CV for free; payment gates only the downloadable file. If the rewrite is bad, you've lost nothing.
  • EU-hosted, data deleted after 30 days. A resume is sensitive; treating it as disposable is a feature.

What I'd do differently

The honesty check should probably be its own fine-tuned classifier rather than a prompted pass — cheaper and more consistent. And parsing remains the single biggest source of errors: if the parse misreads a date or a title, everything downstream inherits it.

If you want to see the honesty angle in practice, it's live at AdaptMyCV — the ATS score checker is free. I'd genuinely like feedback from other builders on the "refuse to fabricate" constraint: too strict? not strict enough? Where would you draw the line?

Top comments (0)