Skip to content
Quentin Barroin

Case study

Novera Megasearch

A candidate-driven IT sourcing engine: fine-grained search, a persistent contact queue, and profiles that enrich themselves.

The sourcing layer of my Novera Talent platform: a two-stage profile search engine, fed by candidates themselves through the novera-talent.com showcase, which automatically enriches profiles and makes them finely queryable by the recruiter.

Role
Design · Product · Development · Hosting
End to end, solo
Year
2026
Type
Candidate-driven IT sourcing engine · part of the Novera Talent platform
Sourcing search
react senior · postgres

Seniority

JuniorMidSeniorLead

Top skills

TypeScriptReactNode.jsPostgreSQL
Contact queuepersistent

The challenge

Manual IT sourcing — LinkedIn, spreadsheets and inbox — does not scale. No fine-grained multi-criteria search, no persistent contact queue, no reuse of search typologies, and no structured capture of candidates who show up spontaneously through the novera-talent.com showcase.

The goal: an engine where the candidate is the starting point. They show up, we enrich them automatically, and they become a finely queryable profile — while the searches that work get saved and replayed.

The solution: a two-stage sourcing engine

An end-to-end “candidate-driven” cycle: the candidate shows up, gets enriched, then becomes queryable — from the first signal to the contact handoff.

Sourcing search

Two-stage search: PostgreSQL full-text over title, skills and experiences + trigram similarity for typo tolerance, with combined ranking and facets.

Saved searches

The search typologies that work are saved and replayable — no need to rebuild criteria every time.

Candidate-driven ingestion

Captures profiles from the showcase, LinkedIn or the extension, in PENDING_CANDIDATE status pending enrichment.

Candidate onboarding

Magic-link email, a 5-step enrichment wizard (PARTIAL then COMPLETE profile) and unsubscribe.

Automatic enrichment

Three free providers — GitHub, personal site, company page — built on a shared EnrichmentFact foundation.

LLM CV parsing

Structured CV extraction via the Anthropic API, run as an async job outside the search hot-path.

Contact queue & export

Browser-persisted contact queue (Zustand + localStorage) and shortlist export to CSV.

Role-driven sourcing

Campaigns → shortlist → handoff to Novera Signal / Unipile for LinkedIn outreach.

Under the hood

Search leans on two native PostgreSQL capabilities — full-text and trigram — rather than an external engine. Enrichment and AI parsing run off the critical search path, as async jobs, to keep queries fast.

FastifyPrismaPostgreSQLNext.jsReactZodZustandAnthropicpnpmVitestPlaywright

Two-stage search

PostgreSQL full-text (tsvector) over title, skills and experiences, combined with trigram similarity (pg_trgm) for fuzzy matching and typo tolerance. Combined FTS + trigram ranking, facets (seniority counters, top skills) and server-side pagination clamped to 100.

Candidate-driven cycle

Ingestion (showcase / LinkedIn / extension) in PENDING_CANDIDATE → magic-link email → 5-step enrichment wizard → PARTIAL then COMPLETE profile → queryable by the recruiter, with non-enriched profiles hidden by default.

Multi-provider enrichment

Three free providers — GitHub, personal site, company page — built on a shared EnrichmentFact foundation. One run produced 5,268 facts and ~581 net-new links across the base.

AI off the hot-path

LLM CV parsing (Anthropic) runs as an async job, off the critical search path — queries stay fast while extraction happens in the background.

Persistent contact queue

The contact queue is persisted in the browser (Zustand + localStorage), so the in-progress shortlist survives between sessions; CSV export for handoff.

Base & test coverage

A base of about 9,600 LinkedIn profiles in PENDING_CANDIDATE, of which ~726 enriched via GitHub, ~290 via personal site and ~65 companies. 366 backend unit tests + 97/97 frontend (Vitest + Playwright).

My role: everything, solo

From vision to hosting, I built Novera Megasearch alone: design, product, back-end and front-end development, and operations. It’s the sourcing layer feeding my own recruitment platform — so it’s the product whose every trade-off I own.

Product & scoping (PO)

Candidate-driven cycle, platform boundaries, roadmap.

Design & experience

Sourcing interface, candidate onboarding wizard, facets.

Full-stack development

Fastify/Prisma backend, PostgreSQL search, Next.js frontend, tests.

Hosting & data

Operations, enrichment runs, profile-base integrity.

Building my own sourcing engine means understanding candidate data and the craft of tech recruitment from the inside. Modelling the search, designing the candidate journey, writing the code and operating it: that end-to-end perspective is what I bring when I assess and recruit tech profiles.