<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Mohamed AlQouqa</title>
    <description>The latest articles on DEV Community by Mohamed AlQouqa (@mohamed_alqouqa_279d1ec18).</description>
    <link>https://dev.to/mohamed_alqouqa_279d1ec18</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3891809%2F52e3eb55-4934-4c64-8ce2-62fa0d5b761d.png</url>
      <title>DEV Community: Mohamed AlQouqa</title>
      <link>https://dev.to/mohamed_alqouqa_279d1ec18</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/mohamed_alqouqa_279d1ec18"/>
    <language>en</language>
    <item>
      <title>I Built a Job Search Engine That Scores Every Listing Against My Resume — 0 API Keys, Runs Locally</title>
      <dc:creator>Mohamed AlQouqa</dc:creator>
      <pubDate>Wed, 22 Apr 2026 06:57:38 +0000</pubDate>
      <link>https://dev.to/mohamed_alqouqa_279d1ec18/i-built-a-job-search-engine-that-scores-every-listing-against-my-resume-0-api-keys-runs-locally-1g6k</link>
      <guid>https://dev.to/mohamed_alqouqa_279d1ec18/i-built-a-job-search-engine-that-scores-every-listing-against-my-resume-0-api-keys-runs-locally-1g6k</guid>
      <description>&lt;p&gt;The Problem&lt;br&gt;
I was applying to jobs the same way everyone does.&lt;/p&gt;

&lt;p&gt;Open LinkedIn. Scroll. Click. Read. Decide. Close tab. Repeat — 50 times a day.&lt;/p&gt;

&lt;p&gt;No system. No filter. No way to know if a job was actually worth my time before spending 20 minutes reading the description.&lt;/p&gt;

&lt;p&gt;So I built one.&lt;br&gt;
&lt;a href="https://github.com/malqouqa92/Job-Tracker-Lite/blob/main/screenshots/Screenshot%202026-04-22%20020328.png" rel="noopener noreferrer"&gt;&lt;/a&gt;&lt;br&gt;
What I Built&lt;br&gt;
Job Tracker is a fully local, zero-cost job pipeline that:&lt;/p&gt;

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

&lt;p&gt;How It Works&lt;br&gt;
Resume (.docx)&lt;br&gt;
     │&lt;br&gt;
     ▼&lt;br&gt;
 intake-v2.js    ← 2-minute wizard: roles, location, salary, skills&lt;br&gt;
     │&lt;br&gt;
     ▼&lt;br&gt;
  fetch.js       ← Fires 7 (Lite) or 31 (Pro) queries via python-jobspy&lt;br&gt;
     │&lt;br&gt;
     ▼&lt;br&gt;
  run.js         ← Scores every job against your profile&lt;br&gt;
     │&lt;br&gt;
     ▼&lt;br&gt;
 server.js       ← Dashboard at localhost:3000&lt;br&gt;
Tech stack: Node.js · Python · python-jobspy · python-docx · Vanilla JS&lt;/p&gt;

&lt;p&gt;The Scoring System&lt;br&gt;
Every job gets scored 1–10 across five dimensions:&lt;/p&gt;

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

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

&lt;p&gt;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.&lt;/p&gt;

&lt;p&gt;Biggest Technical Challenges&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;Windows Store Python stub&lt;br&gt;
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.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;3-tier fuzzy title matching&lt;br&gt;
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.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Skill synonyms&lt;br&gt;
"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.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Hours old → jobspy&lt;br&gt;
Profile duration setting had to flow from the intake wizard → Node → Python argv → jobspy hours_old param. Small but easy to miss.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

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

&lt;p&gt;Windows: download the zip, run setup.bat, done. No admin rights needed.&lt;/p&gt;

&lt;p&gt;Built for personal use. Shared because someone else might need it too.&lt;/p&gt;

</description>
      <category>automation</category>
      <category>career</category>
      <category>productivity</category>
      <category>showdev</category>
    </item>
  </channel>
</rss>
