Case study · Independent build · Solo, end to end
Job Agent
A multi user AI job hunt agent that works while you sleep. Once a day it finds roles, scores each one against your resume, tailors a resume and outreach draft for the strong matches, and tracks every application on one pipeline board.
Job hunting is a part time job of low leverage work
You search the same boards every day and most of what you find is noise. You eyeball each posting and guess whether you are a fit.
For anything promising, you rewrite your resume and a cold note from scratch. Then you lose track of what you applied to and what came back.
The judgment is the valuable part. The searching, the scoring, the rewriting, and the tracking are not. That is exactly the kind of grind an agent should own, while the person keeps the decisions.
A five step loop, each step testable on its own
The run is a five step loop. Each step does one job and passes its state to the next, so the agent is predictable and every stage is testable on its own.
It finds roles from real job board feeds and dedups them, embeds and scores each one 0 to 100 against your resume with a reason, then branches on your fit threshold so only strong matches move on.
For those it writes a tailored resume variant and an outreach draft, tracks everything on your pipeline, and emails a short digest. It is assisted apply, not auto apply: a person reviews and submits every application, by design.
Multi tenant in the database, not the app
This is the part I am most proud of as a product and engineering decision. The diagram encodes the calls that make Job Agent safe to run for many users and easy to reason about one step at a time.
I made it multi tenant in the database, not the app. Every per user table runs under Postgres Row Level Security, so the database itself refuses cross user reads and writes, rather than me filtering by user in code and hoping I never miss a query.
The first version ran the embedding model locally so there was no per embedding cost, with the daily run on a GitHub Actions cron. Productizing it later moved embeddings to a hosted call, so the whole agent now runs on Vercel and each user funds their own usage.
Onboard once, then step back
You upload a resume and tell the agent what you are hunting for: target roles, locations, salary, company types, deal breakers. This is the only manual setup in the whole product.
After this, the daily run takes over. Everything else is the agent's output, not work you do by hand.
Why a role fits, and a draft ready to send
Open any role to see the fit breakdown: the reason, the matched skills, the gaps, and the recommended resume variant. So you can decide fast and prep for the gaps before you ever apply.
Below it, the agent has already written a tailored resume and an outreach draft for that role. Applying is an edit, not a blank page, so it takes minutes instead of an hour.
Know if it is working
Analytics turns the hunt into numbers: the pipeline funnel, the fit score distribution, which sources produce the best matches, and matches over time.
It answers the only question that matters once the agent is running, whether the hunt is actually converting, without anyone pulling a report.
The same logic, now a product you would trust
The first version was correct but it looked like a raw scaffold: default font, black on white, no identity. The logic worked, but nobody would trust it with their job search. So I ran a focused design pass.
I anchored on a job board portal concept, light and airy with rounded cards and a single signature gradient for the standout match, and built a real design system: Plus Jakarta Sans, a calm canvas, soft shadows, color coded fit scores.
The system lives as design tokens in one file and shared primitives, so all eight surfaces stay consistent and the whole look can be retuned from one place.
Their keys, their schedule, their sources
The first version was my tool: my keys, my schedule, one free feed. To hand it to real testers I turned it into a product that runs on theirs. Each person funds and controls their own agent.
Each user connects their own AI keys, encrypted at rest. They set their own schedule, run now or daily or off, and can connect their own Apify token to pull from the major job boards.
Give the person the keys, the schedule, and the sources, and the agent becomes something you can hand to a stranger and trust them to run, not a tool that only works on my machine.
Tech & tools
My role
- Defined the product. Took a fuzzy, familiar problem and turned it into a multi user agent with nine clear user stories, each mapped to a real screen.
- Built the agent. Designed and built the LangGraph run: gather, dedup, score, branch, tailor, persist, notify, with local embeddings and an LLM fit judgement.
- Designed the interface. Built a real design system and applied it across all eight surfaces, taking the product from a raw scaffold to something worth trusting.
- Shipped and deployed it. Live on Vercel with auto deploy on push, a daily GitHub Actions run, Resend email digests, and 56 automated tests green.
- Productized it for real users. Added bring your own keys, per user scheduling with a stop switch, hosted embeddings so it runs on demand, and pluggable job sources.







