A few weeks ago I watched someone in r/SaaS post that they'd automated their entire job hunt with AI agents — scraping listings, scoring them against their resume, even drafting tailored applications — and landed interviews at Amazon and Microsoft. The post got hundreds of comments asking the same thing: how?
So I built it myself. Here's the exact workflow, with real scripts and no magic.
Why manual job search is a data problem
Hundreds of listings, dozens of sources, each with a slightly different application format. The bottleneck isn't writing applications — it's filtering. You can't read 200 job posts a day and still have energy to customize applications.
Treat it like any data pipeline: collect → score → rank → generate → submit.
Step 1: Collect (the scraper)
You don't need to crawl everything. Start with the feeds that matter:
- Hacker News "Who is hiring?" thread — JSON endpoint, zero auth
- Reddit r/forhire + r/jobbit — via the JSON API
- Remote job boards — most have RSS
A minimal collector in Python (stdlib only, no Selenium needed for JSON/RSS sources):
import json, urllib.request, re, time
def fetch_json(url, headers=None):
req = urllib.request.Request(url, headers=headers or {"User-Agent": "job-scraper/1.0"})
return json.loads(urllib.request.urlopen(req, timeout=20).read())
# HN Who's hiring — one endpoint, ~1000 posts/month
hn = fetch_json("https://hacker-news.firebaseio.com/v0/item/42456872.json") # replace with current thread id
for kid in hn.get("kids", [])[:200]:
item = fetch_json(f"https://hacker-news.firebaseio.com/v0/item/{kid}.json")
print(item.get("title", ""), item.get("text", "")[:80])
time.sleep(0.2) # be polite to the API
Save everything to a raw/ folder as JSONL — one line per listing, with source, title, company, URL, and body.
Step 2: Score (the matcher)
This is where an LLM earns its keep. For each listing, score against your profile on three axes:
- Skill match — how many of the required skills are in your stack
- Experience fit — seniority level vs your years
- Culture/interest signal — keywords that match what you actually want to work on
You can do this with a simple prompt loop (works with any LLM API):
You are a job-match scorer. Given the job below and my profile, return JSON:
{"skill_match": 0-10, "experience_fit": 0-10, "interest": 0-10, "reason": "one sentence"}
My profile: Python backend, 5 years, FastAPI/Django, Docker, some React.
Job: {listing_text}
Score everything, then only keep the top 10-15%. The whole point is that the model does the reading, you do the deciding.
Step 3: Rank and dedupe
Group by company (the same role gets reposted across boards), drop anything with red flags (contract-to-hire bait, "fast-paced startup" = unpaid overtime, salary ranges in "equity"), and sort by score × your own weights.
Step 4: Generate tailored applications
For each shortlisted role, generate:
- A cover letter built from the specific requirements in the post (not a generic template)
- A resume bullet list reworded to match their keywords (keep it honest — reword, don't invent)
- A first message for the recruiter/portfolio link
Same LLM, structured prompt:
Write a 150-word cover letter for this role. Requirements: {top 5 requirements}.
My background: {profile}. Style: direct, no buzzwords, show don't tell.
Step 5: Submit with a queue (and follow up)
Manual submit for the top picks (automated submission is against most ATS ToS and gets your domain burned). The automation ends at generation; the submission stays human. Then a follow-up tracker:
| Role | Applied | Follow-up 1 | Follow-up 2 | Status |
|-------------|---------|-------------|-------------|---------|
| API Engineer| 08-01 | 08-05 | 08-12 | In talk |
What I learned
- The score is the product, not the application. An LLM-written cover letter is table stakes now. The real win is only spending your energy on the 10 roles that matter.
- Be boring with ToS. Scrape public JSON/RSS, rate-limit politely, never bypass auth, never auto-submit. This keeps you out of trouble and keeps your sources alive.
- The workflow is reusable. The same collect→score→generate pipeline works for freelance gigs (r/forhire, HN jobs), internships, and even partnership outreach.
The setup cost me about 3 hours: collector script, score prompt, generator prompt, and a followups.md table. Since then, every Sunday morning takes 30 minutes: refresh feeds, review the top 10, generate applications, done.
If you're curious about the full template pack (scorers, prompts, and the tracker as a ready-to-import CSV), I've been documenting this and similar AI workflows at AgentChip — the blog posts there are free, and the templates are cheap one-time downloads. The best automation is the one that gets you back to the work you actually want to do.
Originally published on the AgentChip blog.
Top comments (0)