← Projects

An agent that searched for my next job, and found it

A local job-search CRM with agents at every step, from reading the market each morning to drafting recruiter replies. It proposes; I decide.

Features

Profile and goalsI write down what a good job is: criteria with weights, deal-breakers, pay. Everything else scores against it.
Morning scanA scheduled agent run reads job boards, LinkedIn and recruiter mail, and skips what the CRM already tracks.
Decision reportOne page of decisions to tick. Nothing is applied, archived or sent until I tick it.
CRM dashboardA local board of every job, its stage and the follow-ups due.
Fit scorePaste a job description, get a scored entry against my goals, with the open questions to ask.
Recruiter repliesReplies and pay negotiation drafted from my own notes, shown to me before anything goes out.
Skill drills and CVInterview prep that comes back to the questions I answered badly, and a CV built and checked against the target role.

Architecture

Unattended, every morning

  1. Scheduler Windows Task Scheduler, 07:03
  2. Headless Claude Code runs the morning-scan skill
  3. Sources board APIs, keyword feeds, a Playwright browser for LinkedIn and mail
  4. Report check a hook refuses to finish without today's report

On my machine

  1. Claude Code plugin skills: add job, status, recall, CV review, LinkedIn sync
  2. job-crm CLI validates every entry against the profile
  3. Store one JSON file per job, in git
  4. Web board React + Vite, scoring and pipeline
Two parts: a public engine (plugin, CLI, store, board) and a private folder with my data. The red box is the guardrail on the unattended run.

Metrics

MeasureResult
In use sinceApril 2026
Postings checked per morningAbout 1,630 (median of full runs; the same posting is re-checked each day it is listed)
Postings seen for the first time, per morningAbout 76 (median)
Total postings checked since 24 August70,832 across 29 runs, repeats included
Unique postings since 24 August2,568
Jobs tracked in the CRM160
Applications63
Application to written offer25 days (offer 25 August, accepted the next day)
Postings checked Seen for the first time
24 Aug peak 2,139 27 Sep
Tracked
160
Passed on I said no after the fit score
83
Applied including the later rejections
63

Future steps