projects→linkedin-job-filter

LinkedIn Job Alert Filter / an LLM Pipeline with the Gmail API

From job-alert overload to a shortlist that matches my values

An LLM pipeline that reads my LinkedIn alerts, judges each company’s impact and scores every job against my profile, so 312 jobs become a shortlist of four.

Brass funnel overflowing with envelopes, with a single sealed envelope below the spout, on a saffron background
Status: in progress Type: LLM pipeline Stack:
  • Claude Code
  • Gmail API
  • Jupyter
  • OpenAI API
  • pandas
  • Python
  • SQLite

The problem

In one month, LinkedIn sent me 63 job-alert emails with 282 job links. Despite LinkedIn’s own filters, most were noise: ads in languages I don’t speak, industries I’d rather not work in (gambling, CFD trading, quick-money crypto), and “remote” jobs that weren’t remote for me (but for example, only within certain countries or time zones), or companies that looked more like a pitch deck than a business. Of 76 “remote” jobs the pipeline analysed, only 19 were open to anyone, anywhere. And of the ads it fetched, 42% were already closed.

Reading them all by hand is slow, and keyword filters can’t capture what I actually care about: a role that fits my skills and situation, at a company that has a positive impact on the world.

What I built

A pipeline that reads the alerts for me. It collects every job from my inbox, removes duplicates, and uses an LLM at each step:

The output is a shortlist sorted best first. Each job gets a FIT, MAYBE or NO, a score from 0 to 10, the pros and cons, and the reason behind the verdict. I run it whenever I want a fresh list.

I built it step by step with Claude Code, and there’s still some work to do.

How it works

Every judgement is made by an LLM (the OpenAI API with structured outputs), with its reason saved:

  1. Gmail API (read-only OAuth) finds the LinkedIn alert emails and extracts every job link.
  2. SQLite stores each job once. Every step processes only what’s new, so re-runs are nearly free.
  3. An LLM turns each alert line into clean fields: job title, company, location, work mode (as probabilities) and required languages.
  4. The same LLM rates each company’s impact on the world: positive, neutral or negative, with a reason. If it’s negative, it names the harm (gambling, CFD trading…). Each company is judged only once, even if it posts several jobs.
  5. A first filter drops only the evident cases: harmful companies, languages I don’t speak, roles I’ve ruled out. Borderline jobs go on.
  6. The full ad of each kept job is fetched once, at a polite pace, and saved.
  7. The LLM then reads the full ad: what the company does, where the job can really be done from, contract and hours, seniority, languages, salary and a one-line summary.
  8. Finally, it matches the job against my profile (see right below) and returns FIT, MAYBE or NO, with a score and a reason. Editing the profile re-scores everything automatically.

My profile

The last step only works because the AI knows what I’m looking for. That’s why the AI and I wrote it down together, in plain language:

It’s an ordinary text file, so changing my mind costs nothing: I edit a line, and every job is scored again.

What I learned

Results

On one real run, the funnel looked like this:

So instead of reading 312 job ads, I read four, and skim twenty-four if I have time. A typical FIT looks like this:

FIT, 8/10: remote contractor role building AI agents with retrieval and tool use. My projects match well, though it’s full-time.

What it could do for you

The same pattern works for any inbox that drowns your team: leads, job applications, support tickets, supplier offers. It reads everything, extracts what matters into structured data, filters by your rules, and hands you a ranked shortlist with reasons, so people only read what deserves attention. In my case, 312 job ads became 4 worth reading.

contact

Let's talk.

Need help with something? Looking for a professional who's reliable and believes in karma*?

Tell me about it here, or send me an email. I reply within two working days.

* which means value and integrity come first; reward follows.