Skip to content
Shashi Gyawali
← All work

Case study 03 / Hiring platform / Virtuosway

When the shift doesn't fit, find one that does

At Virtuosway I worked on an AI-powered hiring platform for hourly, shift-based jobs at employers with many locations, mostly on its back end: how applicants get matched to openings, and how offers go out without a recruiter.

APPLICANTONE QUEUENO FITLOCATIONWORK AREANEARBYFIT SCORERANKED JOBSAUTO OFFERGOOD · MEDIUM · BAD

Result

~200%Faster hiring process
<1 sDashboard load, down from over a minute
~60%Less manual language-test review
Role

Full-stack engineer

Years

2023 – 2025

Stack

TypeScript, Node.js, Firestore, Pub/Sub, Elasticsearch

Scope

Matching, offer automation, search

The problem

Hourly hiring runs on schedules. An applicant whose availability didn't fit the job they applied for was a bad fit, full stop, even when the same employer had a shift that suited them a short commute away. Automatic offers had their own gaps: one person could get several offers from the same employer, be offered an opening they had already turned down, or keep an offer after their availability changed.

Architecture

  • I built
  • Managed service
  • 01Matches a build point
APPLICANTHourly, shift-basedjobsRECRUITERSearchescandidatesDASHBOARDLoads in undera secondMESSAGE QUEUEPub/Sub; no requestwaits on itMATCHING WORKERLocation, workarea, then nearbyFIT SCORINGGood, Mediumor BadAUTO OFFERSOne per employer,never re-offeredLANGUAGE TESTPer-jobthresholdsINDEX SYNCKept in sync onevery writeCANDIDATE SEARCHSubstring names,dozen-plus filtersFIRESTOREApplicants, jobs,offersELASTICSEARCHCandidatesearch indexAZURE SPEECHPronunciationscoring

What I built

  1. Nearby-job matching: when an applicant's schedule doesn't fit, a background worker checks the same location, then the applicant's own work area, then the employer's other locations within a short commute (geohash queries). It returns up to five jobs ranked by fit, or makes an automatic offer on the first one that fits.

  2. A rewritten and extended fit-scoring engine. Each shift day earns an equal share of 100 from the hours the applicant's availability covers, with tunable penalties for missing hours and days, and the total is banded Good, Medium or Bad. Overnight shifts reuse the same maths by shifting both time windows by a common offset.

  3. Automatic offers that are safe to run unattended: one offer per employer, enforced in a transaction; a rejected opening is never offered again; a failed offer is retried and falls back to the next candidate; an offer is withdrawn when the applicant's availability no longer fits. All of it is triggered through one message queue, so no request waits on it.

  4. Language-test review with Azure Speech pronunciation scoring against per-job thresholds, replacing recruiters listening to every recording. Anything the speech service can't score goes back to a human.

  5. A critical dashboard that took over a minute to load, and often crashed, re-engineered to load in under a second.

  6. Recruiter candidate search rebuilt on an Elasticsearch index kept in sync on every write. It replaced a database fan-out that needed well over a hundred composite indexes, and adds substring name search and a dozen-plus filters.

Next caseAustralian Pharmacist CPD04 →