Job Board Intelligence Agent
A scheduled Claude agent that searches three job sources every morning, keeps only roles that are genuinely AI-scoped, never sends the same posting twice, and emails a short, phone-friendly digest.
For a businessReplaces hours of daily job-board scrolling with a short list of roles that actually fit. The same pattern works for any daily sourcing task: leads, vendors or candidates.
- Status
- Personal build, runs daily
- Result
- Not measured against an answer key; tuned by reading what arrived each day
- How it was measured
- Each rule came from a real failure: repeated postings, broken links, unverifiable descriptions
- Biggest limit
- One source returns no job descriptions, and its salaries are often estimates
01 · Context The problem
Job boards bury the handful of genuinely AI-scoped roles under postings that mention AI once. Scrolling through them by hand every day wastes the time the search is supposed to save.
The first version of this digest made it worse: it chased a daily number of roles, padded the list with generic jobs that barely touched AI, and kept resending postings that had already gone out.
02 · Pipeline How it works
- Wake up on schedule
A Claude scheduled task runs every morning at 10am with Gmail, Indeed and ZipRecruiter connected. It is written to run start to finish with nobody watching.
- Read its own history
Each run starts fresh, so its past emails are its memory. It reads 21 days of sent digests, builds an exclusion list of company and title, and skips duplicate threads.
- Mine LinkedIn alerts
LinkedIn has no connector, so six saved LinkedIn alerts arrive by email. The agent extracts title, company, location, posting age, applicant count and apply link, and rebuilds any corrupted tracking link into a clean job URL.
- Search Indeed and ZipRecruiter
It rotates through roughly 28 AI and automation title families each day to surface new postings, batches Indeed calls to stay under rate limits, and pages through ZipRecruiter's five-result responses.
- Apply the relevance bar
A role only passes if its title names an AI or automation function, AI is a primary responsibility, or building automated workflows is the core job. AI-as-one-bullet roles, boilerplate mentions, pure engineering jobs and aggregator listings are dropped.
- Verify and label
Promising finds get a verification attempt on Indeed. Anything it can't verify is labeled as unverified, and ZipRecruiter salaries are flagged as possible estimates.
- Rank and send
Newest first, with anything under 48 hours marked priority-apply. One HTML email explains why each role cleared the bar, with a one-line count of what was reviewed, filtered and sent.
03 · Choices Design decisions
Quality over volume
There is no target count. Three strong roles beat three strong roles plus four hopefuls, and a day with nothing good gets a two-line email instead of filler.
Salary as a diagnostic, not a filter
A pay band far below the market for AI-scoped work flags a role for a closer look, but postings without salaries are kept, since many of the best leads don't list one.
Stricter when it can't see the description
If a posting's description can't be verified, it is judged on title and employer, and the bar gets tighter rather than looser.
An honest failure mode
If connectors drop, it reloads them and retries. If everything is down, it still sends a short email saying what failed, because silence looks like a quiet day.
04 · Evidence How I tested it
Tuned against real digests. Earlier versions that chased a daily count padded the list with roles whose salary floors ran far below genuinely AI-scoped roles, which is what led to replacing the quota with the relevance bar.
Each change came from reading what actually arrived: repeated postings, broken LinkedIn links, unverifiable descriptions and source outages all became explicit rules.
05 · After the digest The funnel ledger
A second workflow, in n8n, closes the loop: it turns the digest and every recruiter or applicant-tracking email into one record per application, from applied through screen, interview, assessment, offer or rejection.
- Twice a day, each email once
It reads the inbox (never alerts, promotions or social mail) and skips any message already logged by its id.
- Rules first
Known noise is dropped and known applicant-tracking senders kept before any model runs. The job agent’s own daily digest is recognised and read as “applied” events.
- Claude classifies
Claude Sonnet sorts each email into one of ten event types and extracts the company and role, as JSON only. A failed call isn’t logged, so the email is retried next run; output that won’t parse is logged and flagged for review.
- Code matches and moves the stage
Company names are normalised (aliases, initials, containment), roles matched by word overlap, and each application only moves forward through ranked stages, except that a later step reopens a rejection. Anything under 0.6 confidence, or with no company, is flagged for review.
- Rebuildable
Every event is kept, and my own corrections are stored as events too, so after a matching change a rebuild replays the whole history through the new rules.
06 · Iteration Tuning log
- Quota removedA target of 10 roles a day produced padded digests. Replaced with a relevance bar and no minimum.
- RepeatsThe same postings arrived day after day. Added the 21-day sent-mail exclusion list.
- Broken linksLinkedIn's plain-text conversion corrupted tracking IDs. Rebuilds clean job URLs and says so.
- LocationExcellent matches now surface regardless of location, marked as needing remote flexibility or relocation.
07 · Honest notes Known limits
- ZipRecruiter returns no job descriptions, and its salaries are often algorithmic estimates.
- Indeed rarely indexes postings found on LinkedIn, so many descriptions can't be verified.
- The funnel ledger’s matching code is copied by hand into its rebuild workflow, so the two must be kept in step.
Want to see this one run?
I'll screen-share the workflow, the test set and the results, including what didn't work.