โ† back to all projects

Case Study ยท 2026

GlobalCoach AI

An AI-guided career orchestration platform built during my SIWES industrial training: it compares your CV against live market demand, finds matching jobs with Gemini-powered semantic matching, and tracks your search on an analytics dashboard.

๐Ÿ‘ค Full-stack Engineer ยท SIWES Projectโฑ Industrial training build๐Ÿ“ Source available
๐Ÿง 

The Problem

Job seekers apply blind โ€” no feedback loop between their CV and the market

Most job platforms are directories: they show you listings but never tell you WHY you didn't get shortlisted. Job seekers have no data on which skills the market actually demands this month, or how their CV measures against that demand.

  • โœ—No gap feedback: rejection without explanation
  • โœ—Static job boards can't match CVs semantically to demand
  • โœ—Application tracking is scattered across spreadsheets and inboxes
  • โœ—Career advice is generic, not personal

Why this solution

An asynchronous engine that reads the market and measures you against it

GlobalCoach runs a background engine that compares CV skills against market demand using a frequency-analysis algorithm over live search results. Gemini 1.5 Flash handles semantic job matching with match percentages. TanStack Query keeps the UI live without blocking the user.

  • โœ“Frequency analysis identifies high-demand skill gaps across search results
  • โœ“Gemini 1.5 Flash computes semantic match percentages per job
  • โœ“Asynchronous notifications: zero latency in the user's search flow
  • โœ“De-normalised job metadata persisted โ€” links can expire, insight stays

How it works

01

CV intake

User's CV skills are parsed into a profile

02

Market scan

Background engine analyses live market results for demand frequency

03

Gap analysis

Map-based frequency counters surface the user's high-demand skill gaps

04

Semantic matching

Gemini scores jobs against the profile with match percentages

05

Dashboard

TanStack Query drives live charts: application velocity, skill radar, activity log

Challenges I faced

โš ๏ธ LLM calls blocking the UI

โ†’ fixed: Async background generation with polling-based notification hydration โ€” search stays instant

โš ๏ธ External job links expire

โ†’ fixed: De-normalised metadata persisted with every AI-sourced job

โš ๏ธ Noisy 'demand' signals

โ†’ fixed: Frequency analysis across multiple results rather than single-source trust

โš ๏ธ Full-stack scope during SIWES

โ†’ fixed: Drizzle ORM type-safety across the stack kept iteration fast and safe

Results

LLM

semantic matching with % scores

0 ms

UI latency from async engine

Full

stack: React โ†’ Node โ†’ PostgreSQL

Live

charts: velocity + skill radar

๐Ÿงฐ Built with

ReactViteTailwindNode.jsExpressPostgreSQLNeonDrizzle ORMGemini 1.5 FlashTanStack Query

๐Ÿ’ก What it taught me

Asynchronous-by-default changed the product feel: users never wait for AI. And type-safety end-to-end (Drizzle) is what let a solo dev ship a full-stack LLM product without drowning in runtime errors.