← My Work
AI agents Built on the Anthropic SDK

Autonomous job application agent

An agent that finds roles, judges how well I fit, researches the company, drafts outreach, and fills out applications on real job portals.

Tools 55, across five namespaces
Namespaces Search, evaluate, email, apply, document
Code GitHub

What it does

Applying for jobs is repetitive work: searching, reading postings, judging fit, researching the company, writing outreach, filling out forms, and tracking it all. I built an agent that does the whole workflow on its own.

Its 55 tools are grouped into five namespaces: search, evaluate, email, apply and document. They connect to JSearch and Serper for finding roles and company news, Hunter.io for finding contacts, Gmail for outreach, and Notion for tracking every application.

How it works

A Claude-powered loop chooses tools dynamically from a registry, runs them, and feeds the results back until the task is done. A single run can take 45 or more tool calls, so I added a way to keep results alive across them: external state saved as JSON, which the agent reloads as it goes.

Around the loop is the scaffolding that makes it dependable: retries with exponential backoff, rate limiting, and logging of every tool call with its duration and outcome.

A subagent handles one focused job. Given a company and a role, it works in its own isolated context with a limited set of tools. It reads the job description and my resume, looks up what the company needs, and returns concrete things I could build for them, the most relevant parts of my experience, and talking points for a cold email.

Real job portals

The apply tools drive a real browser with Playwright. The agent detects whether a posting runs on Greenhouse or Lever, then fills out the basic fields, attaches the right portfolio links, answers each company’s custom questions, and handles Lever’s diversity and eligibility sections, all without a person stepping in.

There is also a Streamlit front end, packaged with Docker so it can be deployed, which lets me run the agent from a chat window and pick up a session where it left off.

How I tested it

I wrote an eval harness that runs the agent on realistic requests, such as finding machine learning roles in New York or judging how well my resume fits a specific role, and checks that it called the right tools enough times. I also added unit tests for the retry and state logic, and an integration test of the search flow.

A decision I would defend

I used the raw Anthropic SDK instead of LangGraph. I wanted to force myself to understand every part of the architecture, make the codebase easier to read, and avoid framework magic hiding critical decisions like context management and tool routing.

What's next

With more time, I would write more evaluation scenarios that use real API calls, tune the prompts in the evaluate namespace on real outputs, and summarize context better in very long sessions.

← Back to My Work Ask me about it →