CVfast is a tiny, working AI recruiter built end-to-end with Claude
Code. It pulls candidates two ways — Claude with the
web_search tool, or your own Gmail inbox — and runs them
through a deterministic local scorer, a Claude-drafted outreach
writer, and a single-file review dashboard.
Same brief, same scorer, same dashboard — pick the source that fits the role. Most engagements use both: web first to find people who aren't applying, inbox to triage the ones who are.
web_searchClaude browses public profiles, press mentions and platform pages, returns 25 candidates as JSON. Reproducible from a cron.
make research # → candidates/claude-run-NN.json
Read-only Gmail scope. Pulls PDF / DOCX CVs, extracts text, asks Claude to fill the same candidate shape. Never sends mail.
make inbox-auth # one-time OAuth
make inbox-scan # → candidates/inbox-run-NN.json
dashboard.html, then send.git clone https://github.com/azizsaif1967-afk/aziz-saif-story.git
cd aziz-saif-story/eatcookjoy-recruiter
python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt
cp .env.example .env # paste ANTHROPIC_API_KEY
make research # Claude + web_search
make score # rank
make outreach # draft top-10 emails
make serve # http://localhost:8765/dashboard.html
Five-minute Google Cloud Console setup, then one OAuth click. Full walkthrough in INBOX_SCAN.md.
gmail-credentials.json in eatcookjoy-recruiter/ (gitignored).make inbox-auth — your browser opens, you sign in once.make inbox-scan — it reads matching CVs and writes candidates/inbox-run-NN.json.make score CANDIDATES=candidates/inbox-run-01.json && make outreach && make serve.gmail.readonly
— the script literally cannot send, label, archive or delete
anything. gmail-credentials.json and
gmail-token.json never leave your machine; both are
gitignored. CV text is sent to the Anthropic API for field
extraction. Revoke any time at
myaccount.google.com/permissions.
Targets vs a classic recruiter cycle for the same role. The live demo is the Founding Head Chef brief for EatCookJoy UAE — same tooling, just with that specific brief loaded.