Smart Career Guide
AI Resume & Job Matcher
A web application that analyses a resume against job descriptions, then returns role recommendations and a structured skill-gap report.
0+
Processing stages
0+
Supported formats
0+
Report sections
- Python
- NLP
- Flask
- PostgreSQL
Problem
Candidates apply broadly and learn nothing from rejections. The information needed to target better applications is sitting in the gap between their resume and the job description, but comparing the two by hand across dozens of postings is not something anyone sustains.
- No structured feedback on why a resume does not match a role
- Manual comparison across many postings is impractical
- Skill gaps stay implicit, so learning effort is unfocused
Solution
Upload a resume once, point it at job descriptions, and get a structured report: what overlaps, what is missing, and which roles fit best. The interface leads with the gap rather than a single opaque score, because the gap is the part a candidate can act on.
- Resume parsing across common document formats into a normalised profile
- Job description analysis extracting required and preferred skills
- Match scoring with the contributing terms shown, not hidden
- Skill-gap report grouped by theme so it maps onto learning decisions
Features
- Resume upload and text extraction with format detection
- Normalisation of skills and titles against a controlled vocabulary
- Job description parsing into required versus preferred requirements
- Match score with visible contributing and missing terms
- Skill-gap report grouped into themes
- Role recommendations ranked by fit
Architecture
A thin web layer handles upload and rendering. Extraction, normalisation and matching run as distinct stages so each can be tested and swapped independently, with parsed profiles and postings persisted for reuse.
Swipe sideways to see the full diagram · tapHover or focus a node to trace its outbound calls
Implementation
The application architecture mattered more than the modelling. Keeping each stage independent is what made the pipeline debuggable.
- Extraction, normalisation and matching are separate stages with explicit data contracts
- A controlled skill vocabulary collapses synonyms so scoring is not defeated by wording
- Parsed artefacts are cached, so re-analysing against a new posting skips extraction
- Scores always ship with their contributing terms, which keeps the output inspectable
- Uploads are validated by type and size before any parsing runs
Challenges
Resume formats are not a format
Two PDFs that look identical can extract into completely different text orders. Adding a normalisation pass after extraction, and checking for obviously degenerate output before continuing, made downstream stages far more predictable.
Vocabulary mismatch between resumes and postings
The same skill appears under many names. Without a controlled vocabulary the matcher penalised candidates for word choice. Mapping surface forms onto canonical skills fixed most of the false gaps.
Making a score trustworthy
An unexplained number invites suspicion. Showing the terms that produced the score, and which requirements went unmatched, turned it from a verdict into something a user could reason about.
Result
A working application where a single resume upload produces a match score, an explicit skill-gap breakdown and ranked role recommendations against the job descriptions it is compared with.
Lessons Learned
Explainability was a product feature, not a nicety — the report only became useful once the reasoning was visible. If I extended it, the next step would be tracking a candidate's gaps over time so the app can show progress rather than a snapshot.
Screens
Next project
GymFlow
Gym Management SaaS Platform