DEV Community

AgentChip
AgentChip

Posted on

I Automated My Job Search With AI Agents — Here's the Exact Workflow

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
Enter fullscreen mode Exit fullscreen mode

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:

  1. Skill match — how many of the required skills are in your stack
  2. Experience fit — seniority level vs your years
  3. 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}
Enter fullscreen mode Exit fullscreen mode

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.
Enter fullscreen mode Exit fullscreen mode

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 |
Enter fullscreen mode Exit fullscreen mode

What I learned

  1. 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.
  2. 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.
  3. 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)