DH

Case Study

Job Search Optimizer Tool for Smart Resume Matching

This NLP-powered tool helps job seekers understand how well their resume aligns with a job description. By highlighting language and content gaps that might get flagged by Applicant Tracking Systems (ATS), it increases the chances of making it to a human reviewer.

Overview

I built this tool to solve a personal pain point: I knew I was qualified for roles, but my resume wasn't always reaching a real person. Like most tech job seekers, I found myself bottlenecked by ATS filters—rigid systems that screen resumes before a recruiter ever lays eyes on them.

My goal wasn't to "beat" the system but to work with it more intelligently. By aligning language, tone, and structure more closely to a job description, I wanted to increase the odds of getting to a human. And once I get to a human, I know how to shine.

This solo project doubled as a reentry into Python after 12+ years and my first deep dive into NLP. I treated it like a real-world product: scoped tightly, built iteratively, and structured for future refinement. It's functional, fast, and designed for single-user, local use.

Features

The tool compares a resume and a job description to surface how well they align. It evaluates:

  • Shared and missing keywords
  • Semantic similarity
  • Tonal alignment
  • Readability scores
  • Keyword similarity scoring
  • Job title weighting, similar to ATS relevance models

The output is a clean, static HTML report showing how well your resume will likely perform — before you hit submit.

How It Works

The app uses a simple Flask interface: users upload resumes and job descriptions in .docx format and receive a structured comparison report.

Behind the scenes, the tool runs a configurable NLP pipeline:

Core Features

Section-Based Comparison

Instead of comparing the documents, I split them into configurable sections (e.g., Summary, Skills, Experience). This allows for granular, per-section analysis, improving keyword and semantic comparison accuracy.

Semantic Similarity

Using SBERT (Sentence-BERT) embeddings, the tool compares the intent and phrasing between documents, not just raw keyword overlap. Content is chunked and processed by section to optimize memory usage and inference time.

Keyword Extraction & Similarity

Keywords are extracted using SpaCy and TF-IDF, then compared:

  • Keywords found in both documents
  • Keywords unique to each
  • A keyword similarity score that evaluates alignment on language and concepts
  • A weighted reference for job titles to mirror how ATS systems rank title matches

Tonal Analysis

The tool uses keyword profiling and text clustering to approximate tone — e.g., assertive, technical, people-centric — and analyzes the tone of the resume based on keyword usage and phrasing.

Readability Metrics

To make sure the resume is as clear as it is keyword-aligned, the report includes:

  • Flesch Reading Ease
  • Flesch-Kincaid Grade Level
  • Gunning Fog Index
  • SMOG Index
  • Coleman-Liau Index

Lightweight Architecture

I chose Flask for the backend so that the tool could be quickly and easily deployed locally. The output is a static HTML report—there is no database, no hosting, and no login. It's optimized for fast, private, one-off resume reviews.

Technical Decisions

While the tool was built for my personal use, I approached it with the mindset of a product and platform owner:

  • Modular structure: I wrote reusable functions for each NLP task, with documented inputs and outputs to support future extensibility.
  • Extensible pipeline: While I'm not actively swapping models today, I designed the core logic to be flexible enough for future testing.
  • Minimal dependencies: Designed to run offline with minimal setup, so it can live on a laptop and still provide actionable insights.

Note: This case study outlines the high-level technical design. The whole codebase is private, but I'm happy to walk through the architecture or methodology in a one-on-one conversation.

User Journey

  1. Upload two documents — your resume and a job description.
  2. NLP analysis runs locally, processing sections individually for greater precision.
  3. View a structured report with alignment breakdowns by keywords, tone, semantics, and readability.

The design favors speed and clarity. The tool doesn't store data or require a login—just drop your documents in and see where your resume stands.

Reflections

This project started with frustration — I wasn't getting traction in my job search and suspected the ATS was the blocker. But it quickly became a deeper dive into solving a real UX and language problem using modern NLP.

What I Learned

Relearning Python

It had been over a decade since I'd touched Python. Relearning it in a high-stakes, problem-solving context helped resharpen my development skills quickly and renewed my appreciation for clean, modular scripting.

Discovering NLP

Before this, I had never worked with NLP — but the potential clicked immediately. From semantic embeddings to keyword matching, I became obsessed with the idea that language can be measured, mapped, and aligned.

Designing for UX Clarity

Despite being deeply technical, the tool had to be readable and usable. The UI is minimal, but the structure of the report — and the clarity of each insight — was a UX exercise in itself.

What's Next

While I don't plan to turn this into a public tool or SaaS product, there are a few future enhancements on my roadmap:

  • Visual overlays: Heatmaps and bar charts to show alignment visually
  • Improved model tuning: Tailoring keyword extractors to the tech industry specifically
  • Custom resume recommendations: Text suggestions based on detected gaps
  • Deeper section mapping: Supporting richer, role-specific comparisons (e.g., Engineering vs. Product Manager resumes

For now, the tool remains private, but it's been instrumental in shaping how I approach my resume and my thinking about language, hiring systems, and product design.