CV to Job Matching With Vector Search: Recommendations in Seconds

Case study

CV to Job Matching With Vector Search: Recommendations in Seconds

All case studies

I built a CV matching feature for the careers section of vaiibe.com, which lists remote jobs from micro1, Turing and Mercor. A candidate uploads a PDF or Word CV, an AI model reads the profile, and vector search returns the ten closest open jobs in seconds. The CV stays in private storage and is deleted automatically after 180 days.

3
Job platforms in one index
768
Dimensions per job vector
10
Recommendations per CV
180
Days before a CV is deleted

The problem

The careers section of my site gathers several hundred remote jobs from three hiring platforms. Browsing them is the easy part; finding the right ones is not.

  • Keyword filters miss good matches. A "backend engineer" and an "API developer" can be the same job, and a filter on one word hides the other.
  • Three sources, three formats. Each platform describes skills, rates and locations differently, so the same filter does not mean the same thing everywhere.
  • Candidates give up. Scrolling through hundreds of listings to find five relevant ones is exactly the task people abandon.
  • A CV is sensitive personal data. Any feature that reads it has to be private, minimal and easy to delete, or it should not exist.

The approach

I treated matching as a meaning problem rather than a keyword problem, and privacy as a design constraint from the first line.

One common model for three platforms

A daily sync pulls the open jobs from micro1, Turing and Mercor and normalises them into a single format, with a summary and French and Arabic translations for each listing. Closed jobs are pruned at the next run.

Every job becomes a vector

Each open job summary is turned into a 768 dimension embedding with Google's Gemini embedding model and stored in a Firestore vector index. When a job closes, its vector is removed, so recommendations only ever point to listings a candidate can still apply to.

Reading the CV

A PDF goes directly to Gemini Flash-Lite, and a Word file is converted to text first. The model extracts a structured profile: skills, seniority and domains. That profile is embedded as a search query and compared with every job vector by cosine similarity, and the ten closest open jobs come back to the candidate.

Privacy by design

  • Files land in a private storage bucket with public access blocked.
  • Uploads are limited to three per day per connection to prevent abuse.
  • The candidate receives a deletion token that removes the file and the extracted profile in one click.
  • Every CV is deleted automatically after 180 days.
  • Being contacted about a matching job is an optional choice, never a condition.

Outcome

The feature is live on the careers section of vaiibe.com.

  • Recommendations in seconds: in a production test, a real PDF CV returned ten relevant matches in about six seconds.
  • Matches by meaning, not by wording: a senior Python profile surfaces senior Python and backend roles, and a search about contract law surfaces legal jobs even when the listing uses different words.
  • Results that last: the recommendations stay available on the candidate's device, who can hide them, restart with a new CV or delete everything.
  • Trust built in: private storage, a one click deletion and automatic expiry make the feature usable without asking candidates for blind faith.

The same architecture applies to any catalogue that people struggle to search: products, courses, properties or internal documents. You can try it on the careers page.

Tech stack

Genkit
Gemini Flash-Lite
Gemini Embedding
Firestore Vector Search
Cloud Storage
Next.js
TypeScript

Related services