h@hafizdanishalimuhammadilyas· 1h
Shipped: An AI Job Matcher Agent — paste a job URL + your resume, get a match score, skill gaps, and a cover letter
Applying for jobs is the same loop every time: read the posting, compare it with your resume, guess your chances, then write a cover letter from scratch. I built an agent that does all of it in one request.
**Flow:** paste a job posting URL → upload your resume PDF → get the analysis back.
**Output:**
- `match_score` (0-100) — how well the profile fits the role
- `skill_gaps` — what the job asks for that the resume doesn't have
- `strengths` — what actually lines up
- `cover_letter` — personalized, ready to send
**Stack:**
- **FastAPI** — async API, two endpoints: `/analyze` (JSON, local resume path) and `/analyze-upload` (multipart file upload). Auto Swagger docs at `/docs`.
- **OpenAI GPT** — the reasoning layer. Single structured prompt, JSON-only output, validated with Pydantic before it ever reaches the response.
- **httpx + BeautifulSoup** — scrapes the job page, pulls the title and hunts for requirement lists (looks for `requirements` / `responsibilities` / `you will` headings, falls back to the first bullet lists on the page).
- **pdfplumber** — page-by-page text extraction from the resume PDF.
- **Jinja2 + vanilla CSS** — drag-and-drop UI, no frontend framework.
- **Docker** — `python:3.12-slim`, single container, runs anywhere.
**Two things I'd call out:**
1. **Graceful degradation.** If there's no API key or the LLM call fails, it doesn't 500 — it falls back to a keyword-based scorer that intersects job skills with resume skills and returns a real score. The app is always usable.
2. **Scraping is the hard part, not the AI.** Every job board renders differently, and half of them are JS-heavy. The heuristic parser works on plain HTML postings but site-specific parsers (LinkedIn, Indeed) are the obvious next step.
**Next up:** semantic matching with embeddings instead of keyword overlap, batch mode for multiple postings at once, and swapping temp-file handling for in-memory PDF parsing.
Happy to answer anything about the scraping heuristics or the fallback design.
I mostly build AI agents and automation for businesses — chatbots, workflow automation, the boring repetitive stuff that shouldn't be manual. If you're working on something similar, DMs are open.
Portfolio: https://danish614.github.io/danish-portfolio/