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.
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
๐ก 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.