DEV Community

Cover image for I Built a Job Search Engine That Scores Every Listing Against My Resume — 0 API Keys, Runs Locally
Mohamed AlQouqa
Mohamed AlQouqa

Posted on

I Built a Job Search Engine That Scores Every Listing Against My Resume — 0 API Keys, Runs Locally

The Problem
I was applying to jobs the same way everyone does.

Open LinkedIn. Scroll. Click. Read. Decide. Close tab. Repeat — 50 times a day.

No system. No filter. No way to know if a job was actually worth my time before spending 20 minutes reading the description.

So I built one.

What I Built
Job Tracker is a fully local, zero-cost job pipeline that:

Scrapes LinkedIn, Indeed, Greenhouse, Lever, Ashby, Himalayas and more
Parses your resume automatically
Scores every listing 1–10 based on title match, skill overlap, industry fit, salary, and location
Displays everything on a clean dashboard with pros, gaps, notes, and one-click apply
No API keys. No subscriptions. No cloud. Your data never leaves your machine.

How It Works
Resume (.docx)


intake-v2.js ← 2-minute wizard: roles, location, salary, skills


fetch.js ← Fires 7 (Lite) or 31 (Pro) queries via python-jobspy


run.js ← Scores every job against your profile


server.js ← Dashboard at localhost:3000
Tech stack: Node.js · Python · python-jobspy · python-docx · Vanilla JS

The Scoring System
Every job gets scored 1–10 across five dimensions:

Score Label Meaning
7.5–10 HIGH Strong title + skill + industry match
5.5–7.4 MED Partial match — worth a look
2–5.4 LOW Weak match or failed a filter
Filters that auto-flag a job LOW:

Wrong region (implies relocation)
Niche industry mismatch (QSR, pharma, oil & gas, etc.)
Salary below your floor
Title doesn't match any target role family
The Dashboard
Show Image

167 jobs pulled in one run. 8 HIGH. 23 MED. Every card shows exactly why it scored the way it did — pros on the left, gaps on the right.

Biggest Technical Challenges

  1. Windows Store Python stub
    Windows silently intercepts the python command with a Store redirect that returns no output and no error. Built a resolvePython() function that scans %LOCALAPPDATA%\Microsoft\WindowsApps for the real interpreter.

  2. 3-tier fuzzy title matching
    Exact match → all content words match → shared role noun family. Prevents "Senior Project Manager" from scoring HIGH for a sales rep profile just because "manager" appears.

  3. Skill synonyms
    "Managed teams" should match "team leadership." Built 12 semantic synonym groups: CRM tools, B2B sales, revenue terms, etc. Skill hits are graduated — more matches = higher score, capped to prevent inflation.

  4. Hours old → jobspy
    Profile duration setting had to flow from the intake wizard → Node → Python argv → jobspy hours_old param. Small but easy to miss.

Results From First Real Run
167 jobs pulled across 31 queries
8 HIGH matches identified in seconds
Top result: Regional Sales Manager at Hermès, Manhattan — scored 8/10
Saved ~4 hours of manual scrolling
What's Next
Mac/Linux install script
Cover letter generator per listing
Claude API integration for AI-powered reasoning on each job
Try It
⭐ GitHub: github.com/malqouqa92/Job-Tracker-Lite

Windows: download the zip, run setup.bat, done. No admin rights needed.

Built for personal use. Shared because someone else might need it too.

Top comments (0)