Bilel Abdelmoula

Home › Talent Match case study

Case study · 2024–2026

Talent Match: an AI recruitment platform built end to end

A recruitment ATS and CRM I built at an Italian software startup, from the database to the UI: 130k contacts, 100k companies, 35k candidates and 4k jobs. The client's name stays private; the numbers are real.

  • Xano + PostgreSQL
  • WeWeb, then React + TypeScript
  • OpenAI + Google Vision
  • 2+ years

Results

Measured on real projects.

  • 35kcandidates matched to 4k jobs
  • 15×faster endpoints
  • 32 s → <1 sCV upload wait
  • 8+APIs and services connected

What I built

The problem: recruiters had 35k candidates and 4k jobs. Finding good fits by hand was slow, candidates waited 32 s after uploading a CV, and key screens took up to 12 s to load.

AI candidate matching

Search that understands meaning

  • OpenAI embeddings and vector search to match 35k candidates to 4k jobs.
  • Combined with boolean (AND / OR / NOT) and distance filters so recruiters stay in control.
  • One-off backfill jobs gave the existing candidates their embeddings.
  • OpenAI
  • Embeddings
  • Vector search

Speed

From waiting to instant

  • Slow endpoints 15× faster (12 s → 0.8 s) with PostgreSQL indexes and background jobs.
  • CV upload wait from 32 s to under 1 s: OpenAI and Google Vision parsing moved to background jobs.
  • N+1 queries designed out: one list endpoint ran 1 query plus 9 lookups per row. I designed a 2-query version that keeps the response unchanged (planned, not yet shipped).
  • PostgreSQL
  • Background jobs

Security

Follow-up of an external security audit

  • Fixed SQL injection in 4 custom-query endpoints, then tested the fix.
  • Magic-link login tokens were stored in plain text; fixed and tested.
  • Role checks on the server: every protected endpoint starts with one shared role-check function. Refusals return 403 (a 401 would log the user out). A read-only Back Office role sees everything and changes nothing.
  • Rate limits on password-reset emails (per IP and per address) that never reveal whether an email exists.
  • A per-page cap against overload is in progress across the list endpoints.
  • RBAC
  • Rate limiting
  • SQL injection

WeWeb to React migration

Planned and documented before rebuilding

  • First front end built in WeWeb on the Xano backend.
  • Wrote the migration plan and page specs (login, settings, side menu), catalogued 89 WeWeb collections and documented which roles see what.
  • Rebuilt in React + TypeScript with Claude Code: login, settings and a KPI dashboard, on Cloudflare Workers.
  • WeWeb
  • React
  • TypeScript
  • Cloudflare Workers

What the platform does

Recruiting and sales in one tool

  • Opportunity Kanban boards with meetings, and KPI dashboards.
  • Saved filters, target lists and project exports to Excel.
  • Anonymous candidate reports as PDFs, and CV upload with automatic profile filling.
  • Duplicate-merge checks, unsubscribe syncing and a history of team changes.
  • A public job-application form that creates the candidate, links the project and sends the confirmation email.
  • Kanban
  • Reports
  • Exports

Quality and teamwork

Remote team of 10

  • Written QA checklists for each fix, tested on separate branches with fake data.
  • Stand-ups and ticket reviews with PMs, developers, a designer and the founders; Loom videos to explain fixes.
  • QA
  • Remote
  • Loom

External APIs and AI: where each is used

Everything below ran inside Talent Match.

  • OpenAI embeddings + vector search: Match candidates to jobs by meaning, not just keywords.
  • OpenAI language models: Turn uploaded CVs into structured candidate profiles, in background jobs; also behind the public application form.
  • Google Vision (OCR): Read text from uploaded CVs before the AI structures it.
  • Google Places / Maps: Address and location lookup.
  • Brevo: Transactional emails (password reset, confirmations) and email campaigns, with rules that protect client contacts.
  • Bird: Messaging campaigns.
  • Make: Automation webhooks in earlier versions of the flows.
  • Clientify: CRM integration, tested in a spike.
  • Python, Pandas, Google Sheets + Apps Script: Cleaning, merging and importing data; small reporting scripts.

Tech stack

  • Backend: Xano, PostgreSQL, REST APIs
  • Front end: WeWeb, then React + TypeScript on Cloudflare Workers
  • AI: OpenAI embeddings, vector search, OpenAI + Google Vision OCR
  • Data: Python, Pandas, Google Sheets + Apps Script, a little Airtable
  • Messaging: Brevo and Bird campaigns
  • Tools: Git, Claude Code, Loom

FAQ

Quick answers before we talk.

Which AI models and APIs did you use?

OpenAI for embeddings and for reading CVs, Google Vision for OCR, Google Places for locations, and Brevo and Bird for email and messaging. Each one's role is listed above.

Can I see the code?

No. It's client work for my former employer, so the code stays private. I'm happy to walk through the architecture on a call.

Which parts did you build?

The platform end to end, from the database to the UI: data model, endpoints, AI matching, integrations, security fixes and both front ends.

Can you build something similar for me?

Yes: matching and search, CRM pipelines, document parsing or a faster backend. Book a call and tell me what you need.

Let's build it properly

Tell me what's slow, messy or missing. A short call is enough to see if I can help.

Also see