Screening and shortlisting
AI HR recruitment platform
Screening where every judgement points back to the text that justified it.
Stack
- React
- FastAPI
- PostgreSQL
- Claude API
How we built AI HR recruitment platform
The problem
Screening volume forced a choice between reading every application properly and answering candidates within the week. Most teams quietly pick the second, and the cost lands on candidates who were never read and on a hiring process nobody can account for afterwards.
The constraints
- Every decision had to be defensible months later, to a candidate or a regulator
- Assessment had to run against the role’s real requirements, not keyword overlap
- A hiring manager had to be able to disagree with the reasoning, which means seeing it
What we built
A screening system that reads applications against the role’s actual requirements, produces a structured assessment with the evidence it drew on, and shortlists with reasoning a hiring manager can argue with rather than a score they have to trust.
The decision that mattered
Evidence-linked assessments instead of scores
A score is unfalsifiable. If the system says a candidate is a seven, there is no way to disagree with it specifically, so the only options are to accept it or ignore the tool. We made every judgement point back to the span of the application that produced it, so a hiring manager reviewing a shortlist reads the evidence rather than the conclusion. That is what makes the decision reviewable after the fact, which is the difference between a screening tool and a liability in a regulated hiring process. It also changed how the tool was used: managers overturned assessments regularly in the first weeks, which is exactly what should happen and would have been invisible with a score.
The outcome
Screening that scales with volume while every shortlist decision stays traceable to the text that justified it. Disagreement with the system is possible and specific, which is what makes it usable in hiring.
Recognise this problem?
The architecture usually transfers even when the sector does not. Tell us what you are trying to automate.