← All work

Job Scout

A job-match service that reads job boards and alert emails, screens vacancies against my CV, and passes the good ones to Jobsworth.

Status
prototype
Period
October 2026
Role
Sole developer
The Job Scout settings page, listing keyword searches with their location, radius and the job boards each one runs on.

What it does

Job Scout reads vacancies from several places at once (alert emails, job-board APIs and a watchlist of employers’ own careers boards) and decides which are worth my time. Good matches go into the review queue of Jobsworth, where I promote or discard them, and the plan is for those decisions to feed back into the scoring.

How it works

Collection comes first. The same job often appears on three sites with slightly different titles, so a listing is matched in three steps: the source’s own ID, then a cleaned-up URL, then the company and title seen recently in a compatible location. Merging keeps the fullest description.

Screening then runs in four stages, each more expensive than the last and applied to fewer listings:

  1. Rules, with no model: seniority, salary floor, location and exclusion lists.
  2. Triage: a cheap model reads the title, employer and snippet and says keep, maybe or drop.
  3. Enrich: the full advert is fetched for whatever survives.
  4. Score: the advert is scored against my CV on the same bands Jobsworth uses, with reasons, gaps and red flags. A listing scored from a snippet alone is capped below “strong”, because the model hasn’t seen enough to say so.

The interesting problem

Knowing whether the scores are honest. The first live run read 658 listings from seven employer boards: rules removed 617, triage another 29, and the remaining 25 scored between 24 and 64. Nothing reached the match threshold. That looked like a bug, but on inspection it was the right answer: those boards mostly advertise commercial and technical roles, and my best fits are more likely to come from the Civil Service and aggregator sources, which weren’t connected yet.

So the service has its own evaluation loop. It produces a blind labelling sheet of real listings across the score range; I mark each yes, maybe or no; and any prompt or model change is re-scored against those labels before it goes live.

Stack and why

Job Scout reuses Morning Brief’s scaffolding (the model client, cost ledger, scheduler and email), so most of the work went into the collectors and the screening. The staged pipeline keeps spend small: the whole first run cost about four cents in model calls. LinkedIn is covered through its alert emails only. I don’t scrape it while logged in.

What I would do differently

It is still a prototype: the digest email and the link into Jobsworth are the next phase. I’d have connected the Civil Service and aggregator sources before the employer boards, because they’re where the matches are likely to come from, and the first evaluation would then have tested the scoring on the roles that matter most.

Stack

Python 3.13 / uv
Collectors, screening pipeline and CLI
SQLite
Listings, sightings and the cost ledger
OpenRouter (GPT-6 Luna)
Triage and scoring
Greenhouse, Lever, Ashby and Workday APIs
Employers' own careers boards
Reed and Adzuna APIs, IMAP
Aggregators and job-alert emails
FastAPI
Settings editor, tailnet-only
Docker Compose + Tailscale
Deployment on my home server

658

Listings in the first live run

$0.0006

Model cost per scored listing

  • Repository—private repository