
Status: In progress · Stack: Python, Jupyter, Gmail API, LLM, SQLite
The problem
The last time I checked, LinkedIn had sent me 56 job-alert emails in one month: 243 job links, 199 unique jobs. Despite LinkedIn’s own filters, most of them were noise: wrong location (not remote), a language I don’t speak, industries I’d rather not work in (gambling, quick-money crypto and the like), or companies that looked more like a pitch deck than a business. Reading them all by hand is slow, and keyword filters can’t capture what I actually care about and aspire to: working with 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 to understand each one: the role, the company, the location, whether it’s remote, and which languages it requires. The final step scores each company against my own impact criteria and gives me a short daily list, with a reason for each pick.
How it works
- Gmail API (read-only OAuth) finds LinkedIn alert emails and extracts each job from the links.
- SQLite stores every job once, so re-runs only process what’s new.
- An LLM with structured outputs turns each messy alert line into clean fields: job title, company, location, the work mode as probabilities, and required languages.
- Prompt iteration: the first version guessed languages from the city name. A stricter prompt fixed it: only languages actually named count.
- Next: fetching full job descriptions and scoring impact with a personal rubric.
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.