CV Checker
A privacy-first ATS resume checker that scores a CV with transparent rules, matches it requirement by requirement to a job post, and writes cover letters grounded only in what the CV proves.

80/100
ATS score on the real test run, every point explained
7 months
employment gap detected to the month
12
job requirements mapped to resume evidence
3.3 s
grounded cover letter generated
Inside the product
See it working
Real screens and a recorded run, captured from the working product.
Landing page: "Elevate your resume with deep ATS intelligence".
01 / 17My role
Sole engineer: product design, the scoring engine, the AI layer, the bilingual interface and the security model.
The problem
Most resume checkers return a single opaque number and a generic AI rewrite. Candidates cannot tell why they scored what they scored, and AI-written cover letters happily invent achievements the resume never claims. Many tools also keep the uploaded CVs.
What I built
A Next.js app that separates scoring from generation. The ATS score comes from pure TypeScript rules (parseability, contact details, sections, role alignment, hard skills, experience, keywords and achievement quality), each shown with its signal, weight and points, so the whole score can be audited.
A resume health audit checks contact completeness, timeline order, employment gaps to the month, "ghost skills" listed without evidence, quantified achievements, length and density. With a job post, every requirement is classified as required or preferred and mapped to the exact resume lines that support it, with an evidence-strength rating and a seniority check. The cover letter generator (job-tailored or general) only uses verified achievements, and the whole analysis exports to a PDF report.
Architecture
Uploads (PDF, DOCX or TXT up to 5 MB) are validated by file signature, MIME type and extension, then parsed with pdf.js or Mammoth, with scanned-file detection. A deterministic engine computes the score, health checks and matching. Gemini is used only for structured extraction and writing; its JSON output is validated with Zod and checked against the resume text, and a deterministic extractor keeps the app fully working when the model is unavailable. PDF reports are rendered with headless Chromium.
Challenges
Keeping the language model honest: anything it returns that is not present in the resume is rejected before it reaches the user. Explaining a score instead of just showing it, and detecting gaps and unsupported skills reliably across many resume layouts and both languages.
Key engineering decisions
Deterministic rules for anything that is a judgement about the candidate, and the model only for extraction and wording. A full fallback path so a model outage never breaks an analysis. Privacy by design: resumes are processed per request and never written to a database, disk, browser storage or logs.
Results & impact
On a realistic test resume checked against a Senior Full-Stack job post, the app returned an ATS compatibility of 80/100 with 95% confidence, resume health of 83/100 and a 73% job match. It found the 7-month gap between two jobs (Aug 2021 to Mar 2022), counted 6 quantified achievements, flagged Docker as a missing must-have and PostgreSQL as a missing nice-to-have, and mapped 12 requirements to resume evidence. A job-tailored cover letter was generated in about 3.3 seconds using only the resume's real numbers.
Highlights
- Explainable, weighted ATS score with a full breakdown table
- Employment-gap and ghost-skill detection
- Requirement-by-requirement job matching with quoted evidence
- Grounded AI cover letters: edit, copy or download as PDF
- One-click PDF report of the whole analysis
- English and Arabic with full RTL, light and dark themes, responsive down to phones
- No storage, no-store caching, per-route rate limits and strict security headers

