0:00
/
Transcript

I Built a Job Finder Agent for My Friends. I Just Showed It on Live.

It reads their CV, searches every morning across many sources, explains why each role fits, and gets sharper when they reply to the email. Here is the whole thing, written down.

Thank you Karo (Product with Attitude), Leo Ram, Rajendran, Krithika, and many others for tuning into my live video with Wyndo and Dheeraj Sharma!

Last week I sat down with Wyndo from The AI Maker for a Substack Live. The topic was one specific agent I have been running quietly for months: a job finder I built for the people closest to me. Wyndo just published his writeup of the show, and it is generous and clear, and I am grateful for the room he gave me to actually show the thing.

This is the other side of that conversation. The builder’s side. What is inside the agent, why I built it the way I did, what surprised me about running it for real humans, and the smallest version someone could build this weekend.

Let me start with why this one matters more to me than most things I have shipped.

Why I Built It

Someone close to me was looking for a new role and doing what most people do. Scanning LinkedIn alerts. Filtering through noise. Fighting the algorithm’s idea of what they should want. The signal-to-noise was awful. Five alerts a day, maybe one was worth opening, and that one was already three days stale by the time it arrived.

The job market is not a problem of supply. There are roles. The problem is alignment, and alignment is exactly the kind of work an agent should be doing while you sleep.

I gave myself one rule before writing a line of code. The agent does not apply for anyone. The human judgment, the cover letter, the decision to spend an hour on a specific company, that stays with the person. The agent’s job is upstream of all of that. It is the filter and the explanation. The person opens an email in the morning, reads three roles with a clear reason for each, and either replies or applies. That is the whole loop.

Like, the smallest useful version of this idea is already a real product if you build it carefully.

The Loop, In One Paragraph

Every morning at 6:15, the agent wakes up. It loads the person’s profile, picks which job sources are due based on a tier and a cooldown, browses each one, scores everything it finds against the profile, writes an email with the best three to five roles and a one-line reason for each, and sends it. Throughout the day, the person can reply to the email. A short “not this kind of role, too senior” or “more like this one please.” The next morning’s search uses that reply.

That is the agent. Profile in, daily email out, reply-driven refinement. Everything else is plumbing.

What Is In The Profile

The agent is only as good as the profile it reads. This is the part I underestimated for the first two weeks, and it is the part that did the most work once I took it seriously.

For each person I run the agent for, there is a single source-of-truth file that looks something like this:

  • Current situation. What they do now, employment status, when they can start. Two or three lines, not a CV.

  • Target lanes. Not one role. Three or four. A strong candidate fits more than one pattern, and the agent should respect that. For a creative leader the lanes might be Head of Creative, in-house Creative Director, Brand Creative Lead. For an e-commerce operator the lanes might be VP e-commerce, Digital COO, Head of Digital Transformation. Lanes catch reality.

  • Geography rules. Hard rules. Remote EU first, then named hub cities, then the rest. Anything outside the allowed list gets rejected before it even scores.

  • Salary floor and target. A floor and a target in one currency. Below the floor, the role is rejected unless the company is on a tiny aspirational list. Without a floor, the agent will dribble out underpaid roles forever.

  • Dealbreakers. Concrete things, not vibes. No alcohol, no tobacco, no gambling. No must-have language other than the ones the person actually speaks. Industries that have been tried and disliked.

  • Positive examples. Three to five roles the person would actually want. Real job posts, pasted in. The agent uses these as reference points when it scores. Concrete examples beat any prompt I could write.

The profile is a markdown file. That is the entire format. The agent reads it the way Wiz reads its own CLAUDE.md when it wakes up, with the same discipline: top of context, every run, before any decision.

The Search, In Tiers

Most people building a job agent for the first time make the same mistake I made. They try to search everything every day. That gets you rate-limited fast, costs money, and produces noise.

I run sources in three tiers with a per-source cooldown. LinkedIn is tier one, every day, because it is where the volume lives. Tier two is the major aggregators that have decent role pages, on rotation, two or three per day, with a cooldown so the agent does not pound the same site. Tier three is the company career pages the person actually cares about, listed in their profile. Those run on a longer cooldown because their pages do not change as often.

Three different tools handle the actual fetching:

  • Firecrawl for clean job-page extraction. It returns markdown, which the agent reads directly.

  • Web search through Claude for broad first-pass discovery.

  • Playwright for the sites that need a real browser, which mostly means LinkedIn behind an authenticated session.

None of these is magic on its own. The reason it works is that the agent picks the right tool for the right source, and the cooldowns keep any one of them from becoming the bottleneck. I went deeper on the harness side of this in my post on agent coding harnesses if you want the broader picture.

The Scoring

Every candidate role gets scored on a 0-10 against the profile. The score is not a slider the agent moves around. It is a small set of rules the agent applies in the same order each time.

  1. Lane match. Does the title plus the JD fit one of the lanes in the profile? If no, the role is out.

  2. Geography. Is it in an allowed location, with the right remote rules? If no, the role is out.

  3. Language. Are the must-have languages on the whitelist? If no, the role is out.

  4. Salary. Floor first, then target. Below floor and not on the aspirational list, the role is rejected before scoring.

  5. Fit reasoning. Why this role for this person, in one sentence. The agent has to write the sentence to keep the score.

  6. Concerns. What might be a mismatch. Also one sentence. If the agent cannot name a real concern, the role is probably overhyped.

Anything that scores six or above makes the morning email. Anything below six does not. The number is not a serving suggestion, it is a hard gate. I would rather get two roles tomorrow than five mediocre ones.

The Email

This is the part the friend sees, so this is the part I obsess over.

The morning email is three to five roles. For each role: title, company, link, a one-sentence reason it fits, a one-sentence concern, salary if listed, location, and a suggested next action. That is the whole thing. No promotional framing, no agent personality, no apology when the day is quiet.

If the day is quiet, the email does not arrive. The agent logs a quiet day and goes back to sleep. I learned this one the hard way. An empty digest is worse than no digest, because it teaches the person to stop opening the email. The right move when there is nothing to send is to send nothing.

I write more about how I built the email layer in the post on knowing my agents are actually working. The short version: the email itself is the user interface, so it gets the same care as a product.

The Reply Loop, The Part I Did Not Expect

I thought the search and the scoring would be the interesting parts. They were not. The reply loop was the interesting part.

People do not reply to job alerts. People do reply to a personal email that asks them a real question. So the email closes with a short note: not relevant? Reply with one line and tomorrow’s search adjusts. No form. No button. Just reply.

When the reply arrives, the agent does three things. It classifies the feedback. It applies the change. It updates the profile.

If someone replies “this role at a gambling company, never,” the agent does not just skip that role. It adds gambling to their dealbreakers, permanently. If a reply says “this is too senior, I want builder-track not exec,” the agent shifts the lane weights. If a reply says “more like this one please,” the agent saves that role as a positive example, and the next day’s search leans that direction.

This is the same architecture I described in the post about my self-improving agent: corrections in, classified, graduated into permanent rules when they stop being a one-off. The job finder is the cleanest example of that loop I have built. The feedback is short, the surface is one email, and the change is visible the next morning. People notice when their agent listens.

What I Showed On The Live

Wyndo asked me to do three things on the stream, and I think this is the right order if you ever demo an agent of your own.

First, the email. Before anything else. He had me open a sanitized morning brief and read it out. The audience does not need to see the code yet, they need to see the output. Five roles, a reason for each, a concern for each. That is what the friend opens. If you cannot show that first, the rest of the demo will not land.

Second, the profile. I showed the markdown file with the lanes and the dealbreakers and the positive examples. This is where people get the idea. Most of the audience comments came in during this part. Oh, so the agent uses the JD against the profile? Yes. The profile is the thing.

Third, the reply. I showed one fake feedback message and walked through what the agent did with it. Classified, applied, saved. The audience watched the profile file change. That was the moment of the show, the part I think Wyndo wrote about as “the part where the agent learns from you.”

I did not start in the terminal. I did not show subagents or scheduling or memory. None of that mattered for the demo. The agent loop is profile, search, score, email, reply, and the demo is best when it walks that loop in the order a person would experience it.

The Smallest Useful Version You Could Build This Weekend

If you want to build this for yourself, do not start where I started. Start tiny.

  1. One profile file with current role, one target lane, geography rules, salary floor, three dealbreakers, three positive examples. Markdown. That is it.

  2. One search source to start. Pick the one site you actually use today. LinkedIn if you can authenticate, Indeed if you cannot.

  3. A scoring prompt that takes a profile and a JD and returns a 0-10 score with a one-sentence reason and a one-sentence concern.

  4. A morning email with the top three roles that scored six or above. Send it to yourself first. Run it for a week before sending it to anyone else.

  5. A reply rule. If you reply, the agent reads the reply and updates one thing in the profile. One thing. Resist the urge to make this fancy.

You can build the whole stack on a Claude Code project with a daily cron, a single CLAUDE.md, and a few hundred lines of glue. I went through the basics of agents like this in the first AI agent guide, and the same shape applies here. If you would rather get the structured starter than wire one up from scratch, the agent playbooks on my store include the patterns I lean on for this kind of personal automation.

Once you have run it for yourself for two weeks, then you can run it for a friend.

What I Would Avoid Automating

I want to be clear about the part I will not build, no matter how much someone asks.

The agent will not apply. It will not autofill a form, not click submit, not generate a cover letter and send it. Auto-apply is a temptation because it looks like leverage. It is not. The cover letter that gets the interview is the one the person writes after thinking about the company. Removing that step removes the part that matters. There is also a real cost on the other side: a recruiter reading twenty AI applications gets worse at recognising the human ones. Auto-apply degrades the channel for everyone using it.

I would also not chain the agent into “and if the role fits perfectly, schedule a call.” That is the failure mode I wrote about in the bounded agent post. You want a clear edge between the agent’s territory and yours. Discovery and explanation on the agent side. Decision and action on the human side. The line stays clean and the agent stays useful.

What This Cost Me, Roughly

People asked on the live. The honest answer is that running the agent for one person, with morning searches and a reply pipeline, lands somewhere around a couple of dollars a day on a Claude subscription. Running it for several people is a multiple of that. Cost is not the constraint here. The constraint is the quality of the profile.

If you do want to think carefully about the cost side, especially after Anthropic’s Agent SDK pricing change on June 15, the math gets sharper. A daily run that lives inside the interactive Claude Code session stays on the subscription. A daily run that goes through the SDK lands on the new separate credit. Pick the mode you actually want before you commit to a cron schedule.

One More Thing About Building For The People You Love

The reason I keep coming back to this agent is not the technical loop. It is what happens when a friend writes back two weeks in and says “the email got useful.” That sentence is worth more than any benchmark.

You build something for the people closest to you, and it changes the way you think about what an agent is for. Not productivity. Not scale. Not a leaderboard. Just one person, one morning, three roles, and a reason for each. If the agent does that well, it is doing the job.

Thank you to Wyndo and Dheeraj for the room on the One Shot Show, and to the people who showed up to watch. Watch Wyndo’s full writeup for the audience-side view of the session. If you want me to walk you through a profile of your own, reply to this post. That is how it starts.

Digital Thoughts is a reader-supported publication. To receive new posts and support my work, consider becoming a free or paid subscriber.

Discussion about this video

User's avatar

Ready for more?