More than once, candidates send a CV and get a rejection right after, not knowing why. I know ATS systems sit at that gate, and a weak match between a CV and what the filter wants can end things before a human reads a word.
Talking with friends in HR and talent acquisition showed me their side: plenty of candidates never really read the job description or consider their own fit, and if they get that interview, it shows.
If a machine screens your CV, a machine can also check it first. OnPaper reads your CV against one specific job and names the top gaps, each with one concrete fix.
It will never tell you to write anything that isn't true. Sometimes the fix is a better emphasis, and sometimes the honest answer is that the match isn't there, and that's useful to know even if you still want to apply.
Unlike my other projects, when someone hands OnPaper their CV, it's about as personal as a document gets, so I set the limits before I built anything.
Anthropic runs the analysis anonymously, and nothing is saved. Both OnPaper's site and its backend are secured, so nothing leaks in transit and no human ever sees the submission. At this point there's no account and no sign-up.
PostHog records raw clicks, timing and where people drop off in the flow. It never sees the CV, the job description or the result. I don't collect session recordings, even though I know how much they'd teach me. If recordings are what stops someone from pasting their CV, they cost more than they give.
After each report there's a "Useful / Not useful" button, and I ask people for feedback.
OnPaper runs on a prompt built to force honest answers. Here are some of the rules it lives by:
That leaves the gaps for what a quick eyeball would miss. Every fix has to be something you can do with what you already have: rephrase it, surface it, put a number on it. Each gap is tagged by how hard it is to close: Closable, Stretch or Hard.
In this example, the first gap came back Hard: forecasting sits at the center of the job, and nothing in the CV shows any forecasting work, so the fix doesn't soften it, it says the gap stands as is if there's nothing real to add. The second, Python for statistical modeling, was Stretch, since the CV lists Python only for cleanup, not analysis. The third was Closable: the candidate ran A/B tests but described it as reading out results rather than designing them, so the fix is a single reframe of work already done.
CV: Pasted CV
What the role asks for that your CV doesn’t yet show, with one concrete fix each.
JD's core requirement is "building and running time series forecasting models in production" and this is the central duty ("from day one you will own the models that predict shipment volume and capacity"). The CV shows dashboards, A/B test readouts and SQL analysis but no forecasting work of any kind.
If you have any forecasting or predictive work not on the CV (even demand/returns prediction at Kestrel), add it with the method and where it ran in production; if you have none, this gap stands as-is.
JD asks for "Python for statistical analysis and modeling." CV lists "Basic Python (pandas) for one-off data cleanups" — cleanup only, not modeling.
If you've used Python for any statistical/modeling task beyond cleanups, name the library and the analysis; otherwise state honestly where your Python level sits against the modeling requirement.
JD wants "designing and analyzing experiments... including sample size and significance." CV says you "read out the results of about 15 A/B tests" with the growth team — reporting results, with no mention of designing them or handling sample size/significance.
If you contributed to setting up those A/B tests (sizing, significance thresholds, metric choice), rephrase the line to show that involvement instead of just "read out the results."
I ran my own CV through OnPaper dozens of times with suitable jobs, but also clearly not suitable ones, in seniority or field. I also ran CVs from close friends, because I knew what was on them and which jobs they were going for or had landed. That gave me something to check the results against. All three gaps in a report have to be spot on.
Early on, it flagged small, trivial topics as gaps. So I taught it to read job titles, work out seniority, and compare that level to the role. To test it, I applied on purpose to levels far above and below mine, like a VP of Design, to see how it reacted.
OnPaper started as a tab on my personal job triage site. Two text boxes and one button, built for me.
It worked well enough to earn its own site. It takes a pasted CV, a PDF or a DOCX, and a job link or the job text.
Almost every word a user sees lives in one page I built to review it: errors, buttons, hints, placeholders, the About text. Over 130 messages. I can read them all in one place, rewrite them, and copy them back into the app.
The messaging catalog: every user-facing string, with where and when it appears.
Errors got the most attention. When a CV is too long, OnPaper doesn't say "invalid input". It says the CV is too long for us and probably for talent acquisition too, gives the range it accepts, and shows the length of yours. Two pages is roughly what a recruiter will digest, so the limit belongs to their side, not to my system. When a job link is blocked, it says why, asks you to paste the text, and confirms no run was used.
After a report, "Not useful" opens four quick reasons: wrong gaps, missed something, too harsh, too generic.
OnPaper is live at onpaper.fit and still marked beta. Everyone gets a free run, and free runs reset through the day. Paid runs aren't live yet, and there's a waitlist for when they are. Testers got coupon codes named after superheroes.
Curious? Check your own CV.