The real analytics dashboard on the platform's 10 bundled demo postings: top skills, languages, frameworks, databases, clouds and hiring companies.
The challenge
Matching people to jobs by hand is slow: recruiters and job seekers read long postings, compare them with a resume and guess what is missing. Keyword search misses good matches, and job data from many sources is messy and full of duplicates.
The solution
I built an AI job-matching platform in Python. It collects job postings, cleans them and removes duplicates, extracts the skills each job asks for, then lets you search in plain language or paste a resume to get ranked matches, missing skills, a learning roadmap and a salary range.
The real run
On the platform's 10 bundled demo postings, the search "remote python jobs with fastapi and postgresql" ranked the Senior Python Backend Engineer role first.
A one-paragraph backend resume: 8 skills and 5 years of experience read. The best match (a Django backend role, score 0.62) was missing only Django; the next one listed Celery, Kubernetes and Redis.
The learning roadmap put Kubernetes first (asked for by 4 jobs), and the salary estimate was USD 125k to 215k, median 152.5k, from the 5 postings that list a salary.
Six steps from job postings to career advice, a real plain-language search and the learning roadmap for the same resume.
How it works
Collect: pluggable job sources through a polite HTTP client: robots.txt, rate limits, retries with backoff and incremental crawling.
Clean: text normalised, and exact and near-duplicate postings merged before anything is counted.
Extract: skills and technologies read against a curated taxonomy (languages, frameworks, databases, clouds), optionally enriched with spaCy.
Search: plain-language queries ranked by TF-IDF by default, or by sentence-transformer embeddings with FAISS when installed.
Match and advise: resume parsing, match scores with matched and missing skills, a learning roadmap, salary prediction and career-path suggestions.
Analytics and export: a live dashboard of top skills, remote share, salaries by currency and top companies and countries, plus CSV, JSON or Excel export.
Accounts and roles, brute-force limits and safe exports, checked on a live run. 187 tests at 89% branch coverage.
Security and quality
Accounts and roles: JWT bound to issuer and audience, bcrypt passwords and role-based access. On the live run, resume matching and export without a token returned 401.
Brute force stopped: a separate login budget (after 10 attempts in 5 minutes the next one got 429) plus a per-account lockout.
Safe by default: a strict Content Security Policy with a fresh nonce on every response, exports that cannot run spreadsheet formulas, and a production mode that refuses to start with placeholder secrets.
Tested on a live run: it found a dashboard bug the tests had missed (every skill bar drew empty). It is fixed, with a test that fails without the fix.
187 automated tests at 89% branch coverage, plus ruff and mypy, and pip-audit, Bandit, Gitleaks, Trivy and CodeQL in CI.
Tech stack: Python, FastAPI, SQLAlchemy, SQLite or PostgreSQL, TF-IDF or sentence-transformers with FAISS, APScheduler or Celery with Redis, and Docker.