Talent management

TALENT MANAGEMENT TALENT MANAGEMENT TALENT MANAGEMENT

TALENT MANAGEMENT TALENT MANAGEMENT TALENT MANAGEMENT

TALENT MANAGEMENT TALENT MANAGEMENT TALENT MANAGEMENT

TALENT MANAGEMENT TALENT MANAGEMENT TALENT MANAGEMENT

About the project

Abstract

Talent Management is an internal platform that connects incoming staffing requests to the people best suited to work on them. It reads a request, breaks it down into requirements, and ranks candidates against those requirements based on the content of their resumes.

I built the first version during my internship at Collide, as a matching tool for a single organisation. It has grown a lot since then. It now serves several organisations, handles hundreds of resumes and staffing requests, and runs as a module inside the company's microfrontend platform instead of as an application of its own.

Matching

Matching starts from vector similarity. A resume is parsed into a structured object, and its full text along with each of its sections (hard skills, language information, work experience, certifications, ...) is converted into vectors and stored next to the relational data. An incoming staffing request goes through the same treatment.

Similarity on its own is not enough for every section. Some fields compare badly as vectors, so those are scored against the structured data as well and combined with the vector result. Each section is then weighted, adjusted for how far the categories on both sides line up, and rolled into one ranked list. A reranker will then take the top candidates and reorder them based on a prompt that can be edited by the user.

Spring Boot
Java
Gemini

Requests

Staffing requests arrive in whatever shape the sender used, through whichever channels an organisation already works in. Reading and submitting all of them by hand was the bottleneck, so that part is automated. A document is checked to see whether it is a staffing request at all, then analysed, stored and matched, and the result goes back to the people who have to act on it. Most of this is processed asynchronously.

We keep track of all the data generated by the system. It's entirely searchable / filterable. The same data feeds a reporting layer that shows, for example, which skills and sectors are in demand. That layer is built externally.

n8n
Slack
Xano

Documents

Selecting the best candidates is only part of the flow. Creating a shortlist comes with paperwork, and the platform can generate most of it.

A skill matrix compares a candidate against the requirements of one specific request, built either from their structured resume data or from an uploaded document. Resume optimisation produces a version of a resume aimed at one opportunity. Introduction texts and feedback reports are kept on the request itself. All of it runs on prompts which are customisable. Each user or organisation works from their own set of prompts, and can edit them to their liking.

Gemini
Tanstack Query

Scope

The platform used to cover more ground than it does now. It also held certificate management and an OKR module for tracking objectives.

Both have since moved into separate module applications on the same microfrontend platform. They are about employees rather than about staffing, and the rest of the company gets more use out of them there.

Module Federation
Keycloak

Technologies

Other

Spring Boot

Backend framework for the REST API

Java

Language the backend is written in

AWS

ECS Fargate, S3, CloudFront and the rest of the hosting

Terraform

Infrastructure as code

Keycloak

Authentication & authorization

Gemini

Embeddings and document analysis

Xano

Backend for employee and resume data

React

Frontend framework for building the user interface

Tailwind CSS

CSS framework for styling

Tanstack Query

Data fetching and state management

Zod

For schema validation and type safety in the frontend

GitHub Actions

CI, tests and deployments

And more...

FOOTER FOOTER FOOTER FOOTER

FOOTER FOOTER FOOTER FOOTER

FOOTER FOOTER FOOTER FOOTER

FOOTER FOOTER FOOTER FOOTER