CVBot: a recruiter's candidate search that understands the brief
Recruiters describe the role in plain language and get up to ten ranked candidates in under a minute, every new CV already scored
a virtual-assistant staffing agency (Israel) · 2026
Problem
Recruiters searched a growing applicant base with keyword filters that missed good fits, and screening every incoming CV by hand did not scale either.
What I built
- CVBot: a chat widget for plain-language briefs. Two vector searches run per question, one over the last 60 days of applicants and one over older ones, top 50 each, narrowed by a Cohere reranker to 20. A GPT-4.1-mini agent with 10-message Postgres memory answers with up to 10 unique candidates linking to their Airtable record, streamed into the widget.
- A second mode runs from a button on the position record: the same search for one open role, writing up to 10 matches plus loading and error status back onto the position, so a recruiter stays in Airtable.
- Candidate profiles are embedded with OpenAI (1536 dimensions) into Supabase with pgvector. The system prompt lives in a data table an Airtable automation updates, emailing on success or failure. Every surfaced candidate gets a timestamp for tracking use.
- An intake pipeline runs every two minutes: CVs are OCR'd (OCR Space, 30 second timeout, five retries), validated and capped at 100,000 characters, duplicates for the same person linked, and a same-position duplicate removed unless the earlier one was a no-hire. A scorer rates each CV 1 to 5 against the job description on a weighted rubric (must-haves, responsibilities, domain, preferred, dealbreaker rules, evidence-only scoring) and writes it back. A daily job validates open positions, and every workflow's errors route to one handler.
Result
Recruiters type the brief the way they would say it to a colleague and get ten ranked candidates back in 37 to 49 seconds, each linked to its record. From the position itself, one click returns the same shortlist in about a minute. New CVs arrive scored, deduplicated, and searchable by meaning, on top of an applicant base in the thousands.
What it shows
Retrieval done properly, with time-bucketed searches, a reranker, and memory, is only half of it. The other half is an intake pipeline that keeps the data worth searching.