I’ve seen a lot of agent demos that look incredible right up until you ask one boring question:
“Would I trust this with something that actually matters?”
Usually the answer is no.
An agent ordering lunch is cute. An agent booking a flight is fine. An agent “running your life” is mostly a benchmark for how quickly a demo can drift into nonsense.
But while digging through OpenClaw use cases, I found one workflow that felt immediately real.
A user on r/openclaw shared a supervised job-search agent setup that got 103 upvotes because it solved an actual problem without pretending AI should do the whole thing for you:
- run job search twice a week
- find fresh listings
- rank the top 5 matches
- tailor the resume for each role
- draft cover letters
- keep the final submit step manual
That last bullet is the whole point.
The best job-search agent is not an auto-apply cannon.
It’s a selective pipeline that watches the market, does the repetitive work, and hands a human a shortlist worth reviewing.
The Reddit setup was boring in the best way
The original poster said they were a former data scientist, out of work for about 1 year after 10 years in the field. They ran OpenClaw on a Mac mini, gave it:
- a resume
- a GitHub profile
- a markdown file describing the roles they actually wanted
Then OpenClaw searched twice a week, picked the top 5 matches, tailored the resume, and drafted boilerplate cover letters.
And crucially: it did not auto-submit.
That’s what made it believable.
A lot of job automation optimizes for volume. More tabs. More applications. More browser sessions. More “look how autonomous this is.”
That sounds good until you’ve been on the hiring side.
You can smell spray-and-pray applications instantly.
This OpenClaw workflow did the opposite:
- narrow the target
- rank by fit
- rewrite only for plausible roles
- keep a human in the loop before anything irreversible happens
That’s not less sophisticated.
That’s more sophisticated.
The real advantage is recency, not autonomy
The most useful part of an always-on job agent is not that it can click buttons.
It’s that it can notice good roles early.
That matters more than people admit.
If you’ve job hunted seriously, you know the first few days after a posting goes live are often the best window. The Reddit poster said the eventual role was found 1 day after it was posted, and the process led to an offer in about 1 month.
That tracks.
Humans are bad at sustained vigilance.
We’re good at:
- interviews
- judgment
- deciding whether a role feels right
We’re bad at:
- checking 14 job sources every morning
- staying consistent for 6 weeks
- rewriting the same materials over and over without losing our minds
That’s exactly where an agent helps.
Why job search is a great agent use case
This is one of the cleanest real-world agent workflows because the task is:
- repetitive
- time-sensitive
- open-ended
- mostly text-based
- easy to supervise
A good job-search agent can:
- monitor target boards on a schedule
- score new roles against your criteria
- summarize why a role is or isn’t a fit
- tailor resume bullets to the job description
- draft a first-pass cover letter
- produce a review queue instead of a mess
That’s not sci-fi.
That’s admin work.
And unlike a lot of flashy browser-agent demos, this doesn’t break the second one CSS selector changes.
You probably don’t need browser automation for the most useful part
This was the part I think more developers should pay attention to.
A practical job-search agent does not need to start with LinkedIn scraping and headless browser gymnastics.
A lot of the best value comes earlier in the pipeline: discovery, filtering, ranking, and drafting.
For that, structured APIs beat brittle UI automation.
Start with Greenhouse and Lever
If I were building this, I’d start with Greenhouse and Lever immediately.
Greenhouse Job Board API
Greenhouse exposes public listings as JSON and supports applications through an official endpoint.
Example:
GET https://boards-api.greenhouse.io/v1/boards/{board_token}/jobs?content=true
POST https://boards-api.greenhouse.io/v1/boards/{board_token}/jobs/{id}
Lever Postings API
Lever also exposes published jobs through a REST API and supports programmatic workflows around listings.
That means your architecture can look more like a normal data pipeline and less like a flaky browser bot.
| Option | What it’s good at |
|---|---|
| Greenhouse Job Board API | Public JSON listings, official application endpoint, stable source for monitoring and draft prep |
| Lever Postings API | Published job listings via REST API, structured discovery, realistic source for selective application workflows |
| Headless browser auto-apply on LinkedIn or Indeed | Wider theoretical coverage, but brittle selectors, CAPTCHA issues, UI churn, and much higher risk |
That’s why I think the winning version of this workflow starts with Greenhouse and Lever, not Selenium heroics.
A simple architecture I’d actually build
Here’s the version I’d trust enough to run for weeks.
scheduler
-> fetch job listings from Greenhouse + Lever
-> normalize postings
-> dedupe by company/title/url
-> score against candidate profile
-> shortlist top N
-> generate tailored resume bullets
-> draft cover letter
-> send review packet to human
-> human decides whether to apply
If you want to prototype this fast, the stack is pretty boring:
- OpenClaw for the agent workflow
- cron or GitHub Actions for scheduling
- Python or TypeScript for fetch/normalize/scoring glue
- SQLite or Postgres for dedupe and history
- Claude, GPT-5, or both for ranking and drafting
- email, Slack, or Telegram for review delivery
That’s a real system. Not a conference demo.
Example: fetch Greenhouse jobs in Python
A basic collector is trivial.
import requests
BOARD_TOKEN = "your-company"
url = f"https://boards-api.greenhouse.io/v1/boards/{BOARD_TOKEN}/jobs?content=true"
resp = requests.get(url, timeout=30)
resp.raise_for_status()
jobs = resp.json().get("jobs", [])
for job in jobs:
print({
"id": job.get("id"),
"title": job.get("title"),
"location": (job.get("location") or {}).get("name"),
"updated_at": job.get("updated_at"),
"absolute_url": job.get("absolute_url")
})
Normalize that output into your own schema and score against a candidate profile.
Example candidate profile as markdown
This is the part most people skip, and it’s why their agent outputs garbage.
Give the system a constrained profile.
# Target Role Profile
## Role targets
- Senior Data Scientist
- Applied ML Engineer
- AI Engineer
## Strong preferences
- Remote in US
- Series B+ or profitable company
- Product teams shipping LLM features
- Python-heavy stack
## Hard no
- Onsite only
- Contract-only roles
- Generic "AI evangelist" jobs
- Roles requiring active security clearance
## Salary floor
- $180k base
## Signals of strong fit
- Production ML systems
- Evaluation pipelines
- Agents or workflow automation
- Strong writing / stakeholder communication
That one file will improve results more than most prompt tweaking.
Why I would not fully automate final apply
Because this is where “autonomous” becomes “reckless.”
The original poster made the right call by keeping final submission manual.
I would do the same for three reasons.
1. Job applications are social signals
A resume can be technically aligned and still feel wrong.
A cover letter can mention every keyword and still read like AI sludge.
This is where humans catch:
- weird tone
- overfitting to keywords
- incorrect claims
- missing context about why the company actually matters
2. Browser auto-apply is brittle
If your workflow depends on clicking through dynamic UI flows across LinkedIn, Indeed, and random ATS pages, you are signing up for:
- broken selectors
- CAPTCHA fights
- anti-bot systems
- account restrictions
- constant maintenance
That can still be worth it in some cases, but it should not be your starting point.
3. The final click is the cheapest human step
This is the key tradeoff.
The expensive part is not clicking “Submit.”
The expensive part is:
- finding relevant jobs consistently
- reading them
- comparing them to your background
- rewriting resume bullets
- drafting customized materials
Let the agent do that.
Keep the last irreversible action human.
The hidden villain is token anxiety
This is where a lot of agent workflows quietly stop being practical.
A supervised job-search agent sounds cheap until you count the actual loop:
- read new job descriptions
- compare each role against resume, GitHub, and role criteria
- score and rank candidates
- rewrite resume bullets for top matches
- draft cover letters
- repeat for weeks or months
That burns tokens fast.
Especially if you use frontier models for writing quality.
And this is where per-token pricing starts changing behavior in bad ways.
People don’t just spend less.
They make the workflow worse.
They shorten prompts.
They skip useful passes.
They stop re-running ranking.
They avoid deeper tailoring.
They under-automate the exact tasks that matter.
That’s token anxiety in practice.
Not just “my bill might be high.”
More like: “I know this extra pass would improve output, but I’m going to avoid it because I can feel the meter running.”
For agentic workflows, that’s poison.
This is why flat-rate compute makes more sense for agent workflows
Job search is an unusually clear example of why predictable pricing matters.
You don’t know if a search lasts:
- 2 weeks
- 2 months
- 4 months
And you don’t know how many jobs need evaluation before one is worth pursuing.
That uncertainty is exactly why per-token billing feels bad for long-running automations.
If you’re building agents that need to stay on, re-check sources, rewrite outputs, and iterate without someone watching a token dashboard, flat monthly pricing is just a better fit.
That’s the appeal of Standard Compute.
It’s a drop-in OpenAI API replacement with unlimited AI compute at a predictable monthly price, so you can run agent workflows without worrying that every extra ranking pass or resume rewrite is quietly inflating the bill.
For this kind of use case, that matters a lot more than people think.
Because the best version of the workflow is not the cheapest-looking prompt chain.
It’s the one you’ll actually let run.
Which models I’d use for each step
I would not use one model for everything.
That’s the wrong optimization.
Use the right model for the right stage.
My practical split
- Claude Sonnet for extraction, ranking, summarization, and requirement matching
- GPT-5 for structured scoring and rubric-based evaluation
- Claude Opus for final resume tailoring and cover-letter drafting when tone matters most
- local Llama or Qwen variants for private experiments or cheap pre-filtering
The expensive model should only touch the shortlist.
Don’t spend premium model budget on jobs that fail the first filter.
That’s true whether you’re paying per token or routing across models behind a unified API.
A concrete scoring pipeline
If I were implementing this, I’d separate filtering from writing.
Step 1: cheap scoring pass
{
"title_match": 0.9,
"location_match": 1.0,
"salary_match": 0.7,
"domain_match": 0.8,
"skills_match": 0.85,
"overall_fit": 0.84,
"reasons": [
"Strong Python + ML systems overlap",
"Remote role matches preference",
"LLM product experience is relevant"
],
"risks": [
"Salary not explicitly listed",
"Role leans more platform than research"
]
}
Step 2: shortlist only top 5 or top 10
Step 3: expensive writing pass
Generate:
- tailored resume bullets
- cover letter draft
- quick rationale for why this role made the cut
That split keeps the workflow sane.
Example cron setup for a twice-weekly run
If the original Reddit workflow ran twice a week, that’s a good default.
# Every Monday and Thursday at 8:00 AM
0 8 * * 1,4 /usr/bin/python3 /opt/job-agent/run.py >> /var/log/job-agent.log 2>&1
That’s enough to catch fresh roles without creating noise fatigue.
If the market is moving fast, run daily.
If your criteria are narrow, twice a week is probably ideal.
The version I’d copy tomorrow
If I were building this for myself, I’d do exactly this:
- create a markdown candidate profile with real constraints
- ingest jobs from Greenhouse and Lever first
- schedule discovery daily or twice weekly
- dedupe and store posting history
- score all new jobs with a cheaper model
- shortlist top 5 or top 10
- use a stronger model for resume tailoring and cover-letter drafts
- send everything to a human review queue
- keep final submission manual
That is not a compromise.
That is the product.
The point is not to remove the human.
The point is to remove:
- dead time
- missed postings
- repetitive rewriting
- the constant background stress of checking job boards manually
The OpenClaw story worked because it respected that boundary.
It used the agent for what agents are actually good at:
- staying awake
- reading too much
- filtering chaos into a shortlist
Everything after that still belonged to a person.
And honestly, that’s the first OpenClaw workflow I’ve seen that I’d steal immediately.
If you’re building agent workflows like this, the next thing I’d fix is pricing. Once an automation is useful, it tends to run more often, touch more context, and do more rewriting than you expected. That’s where a flat-rate API setup becomes less of a nice-to-have and more of an architectural decision.
Top comments (0)