free setup guide

when 50 cvs land on one listing, half the day goes into running the same comparison again and again.

claude reads the cvs sent to your listing. it scores each one against the listing out of 100, drops anyone who crosses a red line with the reason written down, puts the shortlist in a table and drafts invites and rejections. age, gender and photos never count. you decide.

already got the doc?

you'll get daily systems by email. unsubscribe anytime. privacy

what it does

when 50 cvs land on one listing, the day goes into one loop. open the cv, check it line by line against the requirements, work out years of experience from the dates, set aside the ones that do not fit, note the shortlist somewhere, write every candidate a separate email. by evening you have read twenty cvs and looked at the last five tired.

this system finishes that loop before you get up and leaves a report on your desk. claude collects the new cvs (pdf, word, plain text), scores each one against the listing out of 100, drops anyone who crosses a red line before scoring, sets aside anyone under the threshold with the reason, and writes the shortlist into a table. it drafts an interview invite for the shortlist and a polite rejection for everyone dropped.

sending is a setting. it starts off: invites and rejections stay as drafts and you send them yourself. once you trust it you tell claude "turn sending on" and it sends.

the one thing it never does is infer. a skill that is not written in the cv does not count, and it does not guess from a job title or a company name. when a cv contradicts itself it does not drop the candidate; it asks you in the report.

how you use it

no terminal needed and you never open a file by hand. you have claude pull the system, you give it your listing, and the rest happens in chat.

the easiest way to pull it: open claude code, give it github.com/muhammedsevimli/systems/tree/main/cv-screening-agent and say "set this up for me". if you know the command line, npx degit gets it in one line, or download the zip from github.

if you want to see the demo first, type screen in the folder. it runs a full screening on the fictional listing and 12 fictional cvs that ship with it, and no email goes out.

then type setup. claude asks for your listing: paste the text or give the link. it pulls the hard requirements and nice-to-haves out of the listing itself and shows them to you for approval. it asks the rest in chat, one at a time: experience band, location, red lines, shortlist size, where cvs come from (a folder on your computer or a gmail label) and what time to run. it writes the listing file from your answers and installs the scheduler itself.

on the first day type screen and read the table and the reasons. if you like it, wait for the morning; it runs on its own at the hour you gave. after a few days of reports, say "turn sending on". if the threshold, a requirement or the shortlist size changes later, you say it in chat and claude updates it. if you disagree with a rejection, you say that too: "move can demir to the shortlist."

you need claude code and python. if cvs arrive in gmail or you want the system to send the emails, you also need chrome, the claude in chrome extension and to have signed into gmail in chrome once. it never asks for or types your password.

commands

  • setup: first-time setup. asks for your listing, asks the questions in chat, writes the listing file and installs the scheduler.
  • daily run: the full flow. collect, read, score, drop, shortlist, invite and rejection drafts, report. the scheduler calls this.
  • screen: read, score and write the table only. no drafts. try this on day one.
  • inspect: the full score breakdown for one cv, with the line in the cv behind every point.
  • invite: interview invite drafts for the shortlist.
  • reject: polite rejection drafts. with sending on they go out on the next run.
  • status: a summary of the table. tell claude in chat who you interviewed and who you hired and it marks them.
  • screen me: candidate mode. your own cv against a listing, the score a recruiter would see, before you apply.
  • cleanup: when the role closes, deletes all candidate data. it shows the list first and deletes nothing until you say "yes".

how it scores

  1. role and responsibility overlap 40.
  2. hard requirements 25, minus 8 for each one missing.
  3. experience band 15: inside the band 15, one year off 8, more than that 0. years are calculated from the dates in the cv; a "x years of experience" line in the summary does not count.
  4. location and work mode 10.
  5. tools, languages and certificates 10, 2 each.

a red line drops a candidate before scoring. the threshold starts at 70 and the shortlist at 5; you change both in chat.

fair screening and privacy

age, date of birth, gender, marital status, children, pregnancy, photo, place of birth, address and district, religion, nationality, disability, health, political views, association membership and military service status never enter the score and never appear in a reason. if a cv mentions them they are read and ignored; the report only says how many cvs contained them.

if you try to make one of these a red line, the agent refuses and suggests a criterion that covers the real need of the job. say "under 30 only" and it offers an experience band instead.

every rejection has a written reason and you see it. rejection emails go out on the next run, so you can change your mind in between. the final decision stays with a person.

cvs are personal data. they stay on your computer and are never uploaded to any site; candidate folders, reports and drafts stay out of the repo. when the role closes you type cleanup and all of it is deleted. these are the system's own rules and they are not legal advice.

looking for a job: screen me

you can run the same system on your own application. type screen me, give it your cv and the listing. before you apply it tells you the score a recruiter would see, why you might be dropped, where you are strong and what your cv does not show.

in the test i gave the fictional elif aydın cv to a fictional senior crm specialist listing at lila moda. the listing said "at least 3 years on insider required" and the cv had no insider. result: dropped without looking at the score. without that line it would have scored 78. the same report caught that the summary's "four years" clashed with the dates (the dates said 5).

it lists gaps in two separate lists: things you have that the cv does not show, and things you really do not have. it never suggests writing experience you do not have.

proof it works

on the day it was built i ran it with a fictional marketing specialist listing for a cosmetics brand and 12 fictional cvs. 3 were pdf, 1 was word, the rest plain text.

12 cvs, 3 minutes. all read, none failed. 5 made the shortlist (96, 91, 79, 76, 74), 1 went to reserve, 6 were dropped.

one of the strongest cvs in the pool was dropped. irmak şahin had one of the highest role overlaps: cosmetics, klaviyo, tiktok ads, sql, a monthly budget of 3 million tl. both jobs were at agencies and the listing's red line was in-house experience. dropped before scoring.

a contradictory cv became a question. one candidate's summary said "fluent english" and the languages section said "b1". the agent read it in the candidate's favor, kept them on the shortlist, put "before sending: ask the owner 1" at the top of the invite draft, and showed in the report that if b1 is right the score drops to 68 and the reserve candidate moves up.

age and photo were seen and not scored. 2 cvs had age, marital status and a photo, 1 had military service status. two of those candidates made the shortlist; none of these fields appeared in any score line, reason or draft.

no reasons in rejection emails. all 6 rejection drafts use the same polite text. invites carry no score, rank or other candidates. emails sent: 0.

a second claude produced the same list. the session that wrote the cvs cannot count as neutral, so a clean copy of the system went to a separate session. the shortlist came out the same 5 people in the same order.

i measured the weak spots too. scores move by up to 5 points between runs; one candidate was dropped at 68 in one run and went to reserve at 70 in the other. that is why candidates near the threshold stay in the report as questions. not tested: the gmail label path, real email sending, the scheduler firing on its own, the macos and linux schedulers, real cvs with tables or two columns.

all the code is open: github.com/muhammedsevimli/systems

what to know

the score compares what the cv says with what the listing says. it does not measure real ability, and a badly written cv can push a good candidate down. reading the ones just under the threshold and the report's question list is your job.

a missing hard requirement does not drop a candidate, it lowers the score. say "drop anyone missing it" and that requirement becomes a red line.

for scheduled runs the computer has to be on at that hour. on the gmail path, if chrome is closed the runner opens it.

where you might get stuck

"could not read: scanned pdf". the cv is an image with no text inside. ask the candidate for a text pdf or a word file.

old .doc file. it cannot be read. open it in word and save as .docx, or ask for a pdf.

the same cv is read again. if you delete the table by hand the agent thinks the cv is new. leave the table to claude.

"gmail session closed" in the report. sign into gmail in chrome and start the run again.

delivery

leave your email above. you get the step-by-step setup guide here and in your inbox. the rules file, the fictional demo listing and 12 fictional cvs, the cv reader, the scheduler installer, the data cleaner and the real run's test result are all inside. if you get stuck, write and i will look.