Skip to main content
Tanmay Savaj — home
AI & AutomationEngineering projectLive demoPersonal project

IntelliApply

AI-driven career automation platform

A full-stack workspace that parses a resume and a job posting, scores the match in code, then uses an LLM to explain the result — resume intelligence, skill-gap analysis, application tracking and interview prep in one app.

Architecture

Architecture illustration of IntelliApply: resume PDFs and job postings are ingested, parsed into structured data, scored by a deterministic engine, explained by a language model, and stored in a tracked application pipeline.

  1. 1. Ingest

  2. 2. Parse

  3. 3. Score

  4. 4. Explain

  5. 5. Track

Select any component marked with a dot to see what it does in this system.

IllustrationConceptual architecture — the deterministic scorer runs before the LLM, never after.
Match scoring
Deterministic 0–100
Score components
5 weighted
Pipeline
7 tracked states
Resume parsing
PyMuPDF + LLM

Problem

A single job application usually means reading the posting, comparing it against a resume, working out which skills are missing, researching the company, tailoring the application, logging it in a spreadsheet, and then preparing for the interview. Those steps are spread across five separate tools.

What I built

  • Resume ingestion that extracts PDF text with PyMuPDF and turns it into structured data — skills, work history, education, certifications and projects.
  • Job ingestion that accepts a URL, pasted text or a PDF, and extracts title, company, responsibilities and required/preferred skills.
  • A deterministic scoring engine that produces a 0–100 match score from weighted components: required skills 45%, preferred skills 15%, experience 15%, responsibilities 15%, education 10%.
  • A skill alias table that resolves "k8s" to "kubernetes" and "js" to "javascript", so wording differences between a resume and a posting do not cost points.
  • An LLM insight layer that explains the score, surfaces strengths and gaps, and returns an apply / consider / low-match recommendation.
  • An application pipeline tracking seven states from SAVED through APPLIED, SCREENING, INTERVIEW, OFFER, REJECTED and WITHDRAWN, setting the applied date automatically on transition.
  • A company research endpoint that queries Tavily and caches results in Supabase for seven days.

Engineering decisions

Language models are not stable enough to be a scoring function — ask one to rate a resume twice and you get two numbers. The score is therefore computed entirely in code, and the LLM is handed the result and explicitly instructed that it is authoritative and must not be recalculated. The same inputs always produce the same score, and only the explanation is generated. Generated insights are validated afterwards, and if the model is unavailable the analysis still returns with insights marked unavailable rather than failing the request. Job input is validated before it is trusted: job-board shell pages are rejected rather than guessed at (generic company names like linkedin, indeed, greenhouse and workday are caught, along with empty responsibilities and too-short page text), and LinkedIn currentJobId search URLs are normalized to their canonical job view.

Outcome

Deployed and publicly reachable, with the frontend on Cloudflare Workers and the API on Render.

Next project

Minesible

Read case study