ROHAN

WORK / JOB RADAR

Job Radar

A daily pipeline that reads LinkedIn's own job-alert emails, scores every opening against my CV, and appends the ranked result to a Google Sheet - no scraping, ₹0 a month.

ROLE

Sole builder

STACK

Python · IMAP · selectolax · TF-IDF · OpenAI (optional) · Google Sheets API · GitHub Actions

TIMELINE

2026

STATUS

Open source · runs daily

Job Radar preview

THE PROBLEM

You want the ten jobs worth your morning, not the two hundred a job board thinks you should see. Tools that promise this either scrape LinkedIn - which breaks its terms and risks the account a job search depends on - or rank by keyword count, which puts a job that says "Python" five times above the one that actually fits.

Job Radar takes the legitimate path: LinkedIn will email you matching jobs every day if you ask. That email is a permission-granted feed. The pipeline reads it, enriches the shortlist, scores each role against my own skill tiers and CV, and writes one row per job into a sheet I own.

CONSTRAINTS

  • -No scraping and no browser automation - only data I was already sent
  • -Runs unattended on GitHub's datacenter IPs, which LinkedIn rate-limits fast
  • -Free to run, with the AI layer optional
  • -Has to fail loudly - a silent cron job looks exactly like a slow hiring week

ARCHITECTURE

Five stages, each handing a normalized Job record to the next, so any one can be replaced without touching the others: Gmail IMAP, alert parsing, gating and enrichment, scoring, and the Google Sheet - which doubles as the pipeline's memory.

  • 01Read - Gmail IMAP with an App Password, read-only BODY.PEEK
  • 02Parse - alert HTML to cards with selectolax, a plain-text fallback, never raises
  • 03Gate + enrich - hard filters first; only the top 15 JDs fetched, each cached forever
  • 04Score - a 7-part weighted rubric with TF-IDF against the CV; optional OpenAI rescoring of the top ~15
  • 05Write - append to Google Sheets, dedup on job_id, never touch the user's status and notes columns
  • 06Run - GitHub Actions at 07:15 IST, with a heartbeat commit and an auto-opened issue on failure

DECISIONS

1.Gate first, then weigh

A job that fails a hard filter - seniority, location, unpaid - is rejected before it's scored, enriched or sent to a model. That keeps every expensive step, and the LinkedIn request budget, for jobs that could actually fit.

2.Freshness weighted like a skill

A 90-point match posted four days ago with 200 applicants is a worse use of today's hour than a 70-point match posted this morning. The score answers "where do I spend the next hour", not "what is the best job in the abstract".

3.AI as an upgrade, never a dependency

The rule scorer is free and needs no key. The OpenAI layer rescores only the day's top ~15 with strict JSON output, and falls back to the rule score on any failure - rate limit, bad request or a non-JSON reply.

4.Fail loudly

Zero jobs parsed from real emails exits with code 2 and opens a GitHub issue, because LinkedIn will change its email HTML. A heartbeat commit stops GitHub disabling the cron after 60 quiet days.

RESULTS

₹0

Monthly running cost

57

Tests, fully offline

07:15

IST, every morning

what I'd do differently…

I'd log outcomes from the very first application. The status column is training data: with around thirty resolved applications, callback rate by score band shows whether the weights are right - and starting that log on day one is the cheapest way to make the score earn trust.

quick answers

Quick answers about Job Radar

What is Job Radar?
A daily pipeline that reads LinkedIn's own job-alert emails, scores every opening against my CV, and appends the ranked result to a Google Sheet - no scraping, ₹0 a month.
What is Job Radar built with?
Job Radar is built with Python, IMAP, selectolax, TF-IDF, OpenAI (optional), Google Sheets API, GitHub Actions.
What was SK Rohan Parveag's role on Job Radar?
Sole builder.
What is the current status of Job Radar?
Open source · runs daily. Links: GitHub (https://github.com/DevRohan33/job-radar).