Inspiration
Job hunting as a student means rewriting the same resume for dozens of postings without knowing what's actually missing. AI resume tools happily say "you're a great fit", and give little to no feedback. I wanted to build a tool that identifies your strengths, but also your weaknesses, and gives you ways to improve.
What it does
- Requirement-by-requirement matching: each JD requirement lands in one of four buckets, and quotes the resume line that supports it:
- covered: shown in real work
- underemphasized: you have it, but only listed
- transferable: the same kind of work with a different tool (EX: GCP -> AWS)
- gap: nothing supports it
- Match score and verdict: required skills count double, and "any one of these" lists count once. The verdict reads strong match, worth tailoring, or a stretch.
- Eligibility check: degree level, enrollment, and graduation windows are checked against your current program. It warns you when you shouldn't apply (EX: a rising senior role for a Master's student)
- Honest rewrites: it suggests rewrites some bullet points on your resume to include keywords from the job description if they are related. Rewrites that add tools or claims you didn't make are rejected in code, and anything only implied is labeled "Only if true"
- Weekend Projects: the tool suggests 1-3 projects per real gap, built on the tools you already know, each with a learning resource whose link has been checked to load.
- Cover letter & interview section: soft skills, traits, and mission fit aren't treated as resume gaps. The tool will suggest that you talk about them in a cover letter/interview.
- Across jobs: history grouped by job (re-run with another resume), and "Learn next" ranks gaps across every posting you analyzed.
- Privacy: upload a PDF or paste text. Your name, email, phone, and links are stripped before anything reaches the AI model.
How we built it
- Backend: Python 3.12, FastAPI, Pydantic v2
- AI: Google Gemini (gemini-3.5-flash-lite) via the official google-genai SDK, with structured JSON output
- Storage: Neon serverless Postgres; in-memory store for local dev
- Resume Parsing: pypdf, plus custom cleaning: contact-info redaction and a "reflow" step for broken PDF copy-paste
- Frontend: React 19, TypeScript, Vite 8, plain CSS Quality: pytest (177 tests), a labeled evaluation harness, oxlint
Challenges we ran into
- Hallucinations:
- Education requirements: the model kept judging against the wrong degree until education timelines were parsed in code.
- Messy inputs: a LaTeX-generated resume pasted as one word per line. A reflow step rebuilds the real lines, which raised extracted evidence.
Accomplishments that we're proud of
- I am happy with the project recommendations to help users bridge the gap between their resume and the position they provided a JD for.
What we learned
- Learned how to use Neon!
What's next for resume-gap
- Let users flag wrong verdicts and feed those corrections back in as examples.
- Larger labeled evaluation sets to compare models
- Accounts, so history follows you across devices.