Bhaskar Thota← All work

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.

Agentic workflowLangGraphRAG fit scoringFull stack, soloNext.js · Supabase
9User stories shipped
5Agent steps in the run
56Automated tests, all green
DailyAutonomous scheduled runs
01 · The problem

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.

02 · How the agent works

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.

03 · Architecture

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.

04 · The product tour

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.

05 · The product tour

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.

06 · The product tour

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.

07 · From working to wanted

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.

08 · Making it a product others can run

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

Next.js 16React 19TailwindSupabase (Postgres, pgvector, Auth, Storage, RLS)LangGraphHosted embeddings (OpenAI)OpenAI · Claude · OpenRouterPer-user BYOK (encrypted)Apify job sourcesGitHub ActionsResendVercel

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.