DIY Recruitment · AI Agent Workflow · Dubai 2026

Hire your Promoter from 1,040 CVs — without an agency.

An end-to-end AI agent that pulls every CV from Indeed.ae and your WhatsApp inbox, reads each one, scores it against your job description, and ships a ranked, searchable HTML dashboard of your top 10 candidates. Done in one afternoon. Total API cost: under one US dollar.

1,040+CVs Processed
4Pipeline Steps
10Top Candidates
~2 HRSTotal Runtime
< $1API Cost
Section 01 · Architecture

Four stages, one AI agent, zero manual sorting.

Each stage feeds the next. Claude runs extraction, scoring and ranking automatically — you manage the inputs and review the shortlist. This is a human-in-the-loop workflow: the agent never contacts candidates or makes a hiring decision.

1

Ingest

Pull CVs from Indeed.ae folder + unzip the WhatsApp archive. Normalise PDF, DOCX and image into one text pool.

2

Extract

AI reads every CV. Extracts name, phone, email, nationality, UAE experience, languages and retail/sales background.

3

Score

Claude scores each candidate against your weighted job rubric on a 0–100 scale and ranks the full list.

4

Output

Generates a searchable HTML dashboard — filter by score, language and experience. Top 10 flagged. Excel export.

Design principle. The AI does the heavy reading and scoring. You review the shortlist and make the hire call. Cancellations, offers and candidate contact stay in your hands — exactly where regulators (and good practice) want them.
Section 02 · Pipeline

The 4-step agent pipeline.

Each step is clearly split between what you do and what the agent does — with the actual prompts you can copy-paste into Claude Code.

1
Manual setup
Ingest — collect every CV into one folder.

Two sources feed the agent: Indeed.ae (1,000+ CVs from your employer dashboard) and 40 WhatsApp CVs sent by friends, agencies and walk-ins. This step merges them into a single input folder the agent will process.

Indeed.ae bulk download. Log into your employer account → Manage Applications → Select All → Download as ZIP. For anything over 50 CVs, use Claude Code's browser agent to loop the dashboard and save every file to ~/Downloads/indeed-cvs/ automatically.
WhatsApp export. On phone, open the chat → select files → Share → Export → save the ZIP to Downloads. On desktop, unzip into ~/Downloads/whatsapp-cvs/.
Claude Code · Browser agent # Task: Download all CVs from Indeed.ae employer dashboard browser.navigate("https://employer.indeed.com/jobs/applications") browser.wait_for("#applications-list") for each application_row: click("Download CV" button) save_file(f"~/Downloads/indeed-cvs/{candidate_name}.pdf") # Runs headlessly — downloads ~1,000 CVs in ~45 min
📁 ~/Downloads/indeed-cvs/ 📁 ~/Downloads/whatsapp-cvs/ ✓ Target ≈ 1,040 files Formats: PDF · DOCX · JPG · PNG
2
You provide · AI configures
Job description — paste your Promoter JD.

Drop the Indeed.ae job description into the agent. The JD becomes the scoring rubric. The agent extracts required skills, experience level, language requirements, nationality preferences, education minimum, and any deal-breaker criteria.

Agent system prompt """ You are an HR screening agent for a UAE retail company. Job Title: Promoter / Brand Ambassador Location: Dubai, UAE # From the job description, extract these scoring criteria: REQUIRED: UAE experience, retail/sales background, English fluency PREFERRED: Arabic speaker, visa status (visit/transferable), presentation standards, own transport DEAL-BREAKERS: No UAE experience, no English, no customer-facing background # Score each candidate 0–100 against the weighted rubric below. """
📋 Paste JD here 🤖 Auto-extracts criteria ⚖️ Builds scoring rubric
3
AI automated
Extract — the agent reads every CV.

Claude Code processes all 1,040 CVs one by one. For each file (PDF, DOCX or image), the agent extracts structured data into a master JSON. Images are OCR'd. Scanned PDFs are parsed. Badly formatted CVs are flagged, not skipped.

Extraction agent loop # For each CV file in ~/Downloads/all-cvs/: extracted = claude.extract(cv_file, schema={ "full_name": str, "email": str, "phone": str, "nationality": str, "visa_status": ["employment","visit","transferable","own"], "uae_experience_years": int, "retail_experience": bool, "languages": list[str], "last_employer": str, "education": str, "source": "indeed" | "whatsapp" }) master_json.append(extracted) # Output: candidates.json (~1,040 records)
📄 1,040 CVs → JSON 🔍 OCR for image CVs 📊 15 fields per CV ⚠ Unreadable CVs flagged
4
Final output
Score, rank & build the searchable dashboard.

The agent scores every candidate against the weighted rubric, ranks all 1,040 and writes a self-contained HTML file you can open in any browser. Searchable. Filterable. Sortable. Top 10 highlighted. Export to Excel in one click.

Scoring + output agent # Score each candidate using the weighted rubric def score_candidate(candidate, job_description): score = 0 score += weight("uae_experience", 25) # max 25pts score += weight("retail_sales_bg", 25) # max 25pts score += weight("english_fluency", 20) # max 20pts score += weight("arabic_speaker", 10) # max 10pts score += weight("visa_status", 10) # max 10pts score += weight("education", 5) # max 5pts score += weight("availability", 5) # max 5pts return score # 0–100 # Build HTML dashboard with search + filters generate_html(ranked_candidates, top_n=10)
🏆 Top 10 auto-selected ✅ HTML dashboard built 🔍 Search by name / skill / score 📊 Excel export button
Section 03 · Scoring rubric

The Promoter rubric — 100 points, transparent weights.

Paste your JD and the agent auto-populates these weights. You can adjust before running. Everything below is editable — the rubric is a starting frame, not a verdict.

Criterion Weight How AI scores it Deal-breaker?
UAE work experience
Retail, FMCG, promotions, events
25 2+ yrs = 25 · 1 yr = 15 · <1 yr = 5 · None = 0 Yes — 0 UAE exp auto-drops below rank 900
Retail / sales background
Supermarket, mall, FMCG, brand
25 Promoter = 25 · Sales/retail = 18 · Customer-facing = 10 · Unrelated = 0 Soft — strongly preferred
English fluency
CV written in English used as proxy
20 Fluent EN = 20 · Mixed = 12 · Non-English only = 5 Near-breaker for Dubai retail
Arabic speaker
Native or professional
10 Arabic listed = 10 · Not listed = 0 No — bonus only
Visa / availability
Visit, transferable, freelance
10 Visit = 10 · Transferable = 8 · Own = 6 · Requires new = 2 No — affects speed to hire
Education
Min secondary school
5 Degree = 5 · Diploma = 4 · Secondary = 3 · Not stated = 1 No
Immediate availability
Can start within 2 weeks
5 Immediate = 5 · 1-month notice = 3 · Not stated = 2 No
Total = 100. ≥ 75 = auto-shortlist · 60–74 = review pool · < 60 = archived but accessible. Top 10 by score = your recommended interview list.
Section 04 · Dashboard output

A single HTML file. No server, no login, no cloud.

The agent writes one self-contained file. Open it in any browser. Search, filter, sort 1,040 candidates instantly. Top 10 highlighted. Print or export to Excel.

cv-screening-results.html — 1,040 candidates loaded
Promoter Candidate Dashboard 1,040 CVs · Top 10 flagged 📊 Export Excel
#CandidateNationalityUAE expLanguagesVisaScoreStatus
★1Sarah Mohammed Al-Farsi
Lulu Hypermarket · 3 yrs · Indeed
UAE National3 yrsEN · AROwn94Shortlist
★2Priya Rajan Nair
Carrefour UAE · 2.5 yrs · Indeed
Indian2.5 yrsEN · HITransfer91Shortlist
★3Maria Santos Cruz
Spinneys Dubai · 2 yrs · WhatsApp
Filipino2 yrsEN · FILVisit88Shortlist
4Fatima Al-Qasimi
Landmark Group · 1.5 yrs · Indeed
Egyptian1.5 yrsEN · ARTransfer82Shortlist
5Ravi Kumar Sharma
Noon.com · 1 yr · Indeed
Indian1 yrEN · HI · UROwn79Shortlist
6Aisha Benali
Morocco — no UAE exp · Indeed
Moroccan0 yrsEN · FR · ARVisit48Archive
Showing 6 of 1,040 · Sorted by Score ▼ Click any row → full CV viewer

Top 10 — final shortlist preview

# Candidate Score UAE exp Arabic Status
1
Sarah Mohammed Al-Farsi
Lulu Hypermarket · UAE National
94
3 yrs
Shortlist
2
Priya Rajan Nair
Carrefour UAE · Indian
91
2.5 yrs
Shortlist
3
Maria Santos Cruz
Spinneys · Filipino
88
2 yrs
Shortlist
4
Fatima Al-Qasimi
Landmark Group · Egyptian
82
1.5 yrs
Shortlist
5
Ravi Kumar Sharma
Noon.com · Indian
79
1 yr
Shortlist
6
Amina Yusuf Hassan
Zoom Supermarket · Somali
76
1 yr
Shortlist
7
Chen Wei Ling
Emax Electronics · Chinese
74
1.5 yrs
Review
8
Kofi Asante Mensah
Union Coop · Ghanaian
71
0.5 yr
Review
9
Nadia Petrov Volkov
IKEA Dubai · Russian
68
1 yr
Review
10
Lakshmi Patel Reddy
Choithrams · Indian
65
1 yr
Review
Section 05 · Behind the build

How it was done — step by step.

The DIY Recruitment workflow was built the same way the DIY Marketing coach was — by stacking Claude Code with a few open libraries and a clear set of prompts. Here's the build log, in order.

Step 01 · 15 min

Set up the working folder.

Create the three folders the pipeline writes into. Indeed CVs and WhatsApp CVs land in separate sub-folders so the agent can tag the source in the final JSON.

  • ~/Downloads/indeed-cvs/
  • ~/Downloads/whatsapp-cvs/
  • ~/Downloads/all-cvs/ — merged pool
Step 02 · 10 min

Install Claude Code + the four Python helpers.

Claude Code orchestrates the agent. Python handles the file plumbing — PDF text, DOCX, images and ZIP extraction.

  • npm i -g @anthropic-ai/claude-code
  • pip install pymupdf pdfplumber python-docx pillow pytesseract playwright openpyxl
  • playwright install chromium
  • Drop your ANTHROPIC_API_KEY into .env
Step 03 · 45 min

Run the Indeed browser agent.

Paste the browser-agent prompt into Claude Code and point it at your Indeed employer dashboard. It logs in, walks the applications list page by page, clicks Download CV on each row, and saves the file with the candidate's name.

  • Headless Chromium via Playwright
  • ~1,000 CVs in ≈ 45 minutes
  • Handles pagination + rate-limit back-off
Step 04 · 5 min

Unzip the WhatsApp archive & merge.

WhatsApp's "Export chat" produces a ZIP of every attached file. Unzip it, then copy everything (PDFs, DOCX, images) into the merged pool.

Stage 1 · Ingest WhatsApp $ unzip ~/Downloads/whatsapp-cvs.zip -d ~/Downloads/whatsapp-cvs/ $ cp ~/Downloads/whatsapp-cvs/*.pdf ~/Downloads/all-cvs/ $ cp ~/Downloads/whatsapp-cvs/*.docx ~/Downloads/all-cvs/ $ cp ~/Downloads/indeed-cvs/*.pdf ~/Downloads/all-cvs/ $ echo "Total: $(ls ~/Downloads/all-cvs/ | wc -l)"
Step 05 · 5 min

Paste the JD & lock the rubric.

Drop your Indeed.ae Promoter JD into the agent. Claude extracts requireds, preferreds and deal-breakers, and proposes the 7-criterion weighted rubric (see Section 03). Tweak the weights, then approve.

  • JD → rubric translation runs in < 10 seconds
  • Weights can be edited inline before scoring starts
  • Saved to rubric.json for the audit trail
Step 06 · ~45 min

Run extraction across all 1,040 CVs.

One Claude Code command kicks off the full extraction loop. PDFs are parsed for text; scanned PDFs and image CVs are OCR'd; the agent writes 15 fields per candidate.

Stage 2+3 · Claude Code command $ claude "Process all CVs in ~/Downloads/all-cvs/. Extract: name, email, phone, nationality, UAE experience years, retail background (yes/no), languages, last employer, visa status. Job description: [PASTE YOUR JD HERE]. Score each 0–100 against the promoter rubric. Output a ranked candidates.json file."
Step 07 · 10 min

Build the searchable HTML dashboard.

Second Claude Code command reads candidates.json and writes a self-contained dashboard. Search, eight filters, sortable table, top-10 highlight, Excel-export button.

Stage 4 · Build dashboard $ claude "Read candidates.json. Build a self-contained HTML file with: - Search bar (name, nationality, employer) - Filter buttons: Top 10, Shortlist 75+, Review 60-74, Arabic Speaker, Visit Visa - Sortable table: rank, name, nationality, UAE exp, languages, visa, score, status - Top 10 highlighted in green - Excel export button - Click row to see full CV summary Save as cv-screening-results.html"
Step 08 · 20 min

Review the top 10 & ship the interview invites.

Open the HTML in any browser. Sanity-check the top 10 against the original CVs (one-click view). Export to Excel for HR records. Send WhatsApp interview invites from your own number — never from the agent.

  • 2 minutes per top-10 candidate sanity check
  • Excel export for compliance / archive
  • You write the interview invite — human in the loop
Why this works. The same pattern that powers azizsaif.com/diy-marketing — a thin orchestrator (Claude Code), a fat schema (JSON), and a single-file deliverable (HTML) — is the spine of every DIY workflow on this site. Recruitment is just the next vertical.
Section 06 · Technology

The stack — six pieces, mostly free.

Everything is either bundled with Claude Code, free on your existing accounts, or open-source. Total recurring cost: one Claude Pro seat.

CC
Claude Code
Browser agent · orchestrator

Drives Playwright to download CVs from Indeed.ae. Orchestrates the full agent loop. Writes the output HTML. Your CLI AI worker.

AI
Claude API
Extraction · scoring

Reads each CV (PDF / DOCX / image), extracts 15 structured fields, scores against the rubric. Runs in batch — ~1,000 calls via the Anthropic API.

PY
Python
File processing · glue

PyMuPDF / pdfplumber for PDFs. python-docx for Word. Pillow + pytesseract for image CVs. zipfile for the WhatsApp archive.

PW
Playwright
Browser automation

Headless Chromium for Indeed.ae bulk download. Logs in, navigates the applications list, downloads every CV without a single click from you.

XL
openpyxl
Excel export

Writes a formatted XLSX workbook from the ranked candidate JSON. Colour-coded score bands. One-click export from the HTML dashboard.

HT
HTML + JS
Dashboard

Self-contained single HTML file. No server. Open in Chrome / Edge. Search, filter, sort 1,040 candidates. Print-ready. Share by WhatsApp.

Cost estimate. 1,040 CVs × ~500 input + 200 output tokens ≈ 730K tokens total. At Claude Haiku pricing, total API cost lands at $0.20–$0.50 USD for the full batch — effectively free.
Section 07 · Execution timeline

From zero to interviews booked — one afternoon.

Five lanes, one day. Setup, ingest, extract, score, ship. By Day 2 you're on WhatsApp with the top 10.

Day 1 Setup
  • Install Claude Code CLI
  • Install Python + libraries
  • Create folder structure
  • Test API connection
Day 1 Ingest
  • Run Indeed browser agent
  • Download ~1,000 CVs
  • Unzip WhatsApp archive
  • Merge into /all-cvs/
Day 1 Extract
  • Paste job description
  • Run extraction agent
  • AI reads all CVs (~45 min)
  • Generate candidates.json
Day 1 Score
  • Review scoring rubric
  • Adjust weights if needed
  • Run scoring agent
  • Ranked list generated
Day 1 Ship
  • HTML dashboard built
  • Review top 10
  • Export Excel if needed
  • Send interview invites
Total time. Setup 1 hr · Indeed download 45 min · AI extraction 45 min · Scoring + output 15 min. Everything done in one afternoon. Ten interviews scheduled by Day 2.
Want this run for your next role?

Bring me the JD. I'll send you a ranked shortlist.

DIY Recruitment runs in your account, on your data, under your control. If you'd rather watch over my shoulder while it runs, send the JD and your application source over WhatsApp — same playbook, run for you.

WhatsApp the JD → See DIY Marketing →