Why I built this

The long version

The short version is on the home page. This is the long one — what this system is, why it’s a genuinely better way to run a job search, and how it works under the hood. No marketing gloss; just the honest account.

The story

A real job search is mostly repetition. For every role worth applying to, you research the company, re-tailor your résumé to what they actually need, write outreach that doesn’t read like a template, and prepare for the conversations — then you do it again, dozens of times, while keeping track of where everything stands. Done well it’s a part-time job; done at volume it’s impossible to do well by hand.

So I built an AI agent system that runs that loop for me — continuously, and with me still in the driver’s seat. It does the grind so my attention goes to the parts that actually need a human: the conversations, the judgment calls, the decision about which opportunities are worth pursuing. Everything it produces is grounded in my real experience — it selects and re-emphasizes what’s true for a given role, it never invents a skill or a result I don’t have.

And rather than describe all of that, I decided to show it. This entire site is the system, running live: the pipeline you can watch, the agents working in real time, and a live run that will tailor my materials to your open role on the spot. The showcase is the product — which is also the most honest portfolio piece I could build, because you can check every claim against the thing actually doing the work.

How it works, in words

The system runs a continuous loop, and I approve anything that leaves it:

  • It finds roles. It watches job sources for openings worth applying to and keeps a running shortlist, so the search never goes cold.
  • It researches and tailors. For a given role it studies the company and re-frames my résumé toward what they need — selecting from real experience, never fabricating. Re-emphasis, not embellishment.
  • It drafts the outreach. It writes a cold-outreach email I can review and send — a reversible draft, never sent on its own.
  • It builds interview prep. When a process advances, it assembles a prep dossier grounded in the role and my background.
  • It learns from outcomes. After a rejection or an interview it talks it through with me, and when a pattern shows up it coaches — “three rejections this month all at the system-design round; worth focusing prep there?” It files what’s worth remembering, so the next time it tailors for a similar role it leads with the strength a past miss left under-weighted. It’s memory, not magic: the system gets sharper because it remembers, not because it retrains itself.

Want the technical version? The live system map shows every moving part with real-time status, and the whole thing is open source — read the code ↗.

Meet the cast

The search isn’t one AI — it’s a small cast of specialists the orchestrator hands work to, plus a couple of models that run on their own. Each does one job, and the site names them honestly wherever they show up.

  • Company researcher

    Digs into a target company — product, tech, what they’re hiring for — and produces the briefing the other agents build on.

    reads, changes nothing

  • Résumé tailor

    Tailors my master résumé to one specific role, foregrounding the experience that fits — it selects and re-emphasizes, never invents.

    reads, changes nothing

  • Outreach writer

    Writes a personalized cold-outreach email. In my real search it lands as a Gmail draft I review before anything sends.

    writes reversible drafts

  • Interview-kit builder

    When an application reaches an interview round, builds a two-part mock-interview kit — an interviewer manual and a phone cheat-sheet — as a private Google Doc.

    writes private Docs

  • Job scout

    Continuously scouts a live jobs index for fresh postings, filling the pool of leads the search works from.

    fills the leads pool

  • Pipeline curator

    Keeps the public pipeline honest — tracks each application’s stage from recruiter signals and curates which applications are safe to reveal.

    curates the public view

  • Win-confidence scorer

    Scores each application’s odds of becoming an offer and writes the one-line rationale for it — a heuristic that updates as recruiter signals arrive, not a promise. It runs on its own, not as one of the dispatched agents.

    scores the pipeline

  • Orchestrator

    The orchestrating agent that runs my search end-to-end and dispatches the specialist subagents.

    runs the whole loop

Why companies are hidden

While a hiring process is live, the company shows as a category label — fintech-b, not the real name. That’s deliberate. I reveal a name only when it’s appropriate: a closed process the company is fine making public, or a lesson worth sharing. And no personal details — recruiter names, email addresses, scheduling links — ever appear anywhere; they’re stripped before anything is shown. It protects the companies and the people I’m actually talking to, and being upfront about it is itself the point.

Where the keys live

No raw API key ever enters the agent’s container. Credentials are split across two purpose-built vaults: one holds the model-provider key, so the container only ever talks to a gateway that makes the real call; the other holds everything else — the Google sign-in, the chat-bot token — and injects each one at request time based on where the request is headed. The container’s own environment contains exactly zero secrets. It’s how serious AI shops run agents in production — not security theater.

What this site logs about your visit

This site keeps a first-party log of visits — no third-party trackers, no cross-site cookies, no ad-tech. When I share a link to this showcase — on my LinkedIn, on a résumé I hand out, or in a cold-outreach email the agent sends — that link carries a short note of where it came from, so a click tells me which channel found me. For anything I post or hand out that note is a plain-text label you can read right in the address bar (something like ?from=my_linkedin) — not even hidden in a code; a one-to-one outreach email keeps a short unique code so I can tell which company opened it. That’s the whole point of a public job-search showcase. The log keeps a salted hash of your IP (enough to tell a repeat visit from a new one, without storing the address itself), a coarse country, and which page you landed on — held for a bounded window, then deleted, and visible only to me behind an authenticated page. A “watch it work” run works the same way: the company, role, and job description you enter and a redacted trace of the run are stored privately on the same terms — visible only to me, deleted after a bounded window — while the public recent-runs list shows nothing but aggregate cost and runtime. I deliberately turned down the free third-party analytics beacon; I’d rather keep the whole thing first-party and legible.

Safety controls

The system runs with explicit guardrails: a shadow-versus-live distinction, a pause switch that halts all activity at once, and per-action budgets and caps so it can’t run away. Anything irreversible or outward-facing is gated — nothing sends without my say-so. The current operating mode is shown on the system map.

What it costs to run

I’d rather show the number than wave at it. This is the live tally from the system’s own telemetry — every model call it has made, summed up.

The meter starts once the first agent turn runs.

These are estimates summed from per-call model usage at list prices — not a bill. Prompt caching re-serves unchanged context instead of reprocessing it, which is why a system that runs all day costs what a coffee does.

The stack, and why

  • NanoClaw — the open-source agent host it’s built on; I forked and customized it rather than reinvent the harness.
  • Claude Agent SDK — the in-process agent runtime; the orchestrator and its specialists are Claude.
  • Portkey — the gateway every model call routes through: one place to watch cost, and the provider key never enters the container.
  • OneCLI — the credential vault that injects everything else on the wire.
  • TanStack Start on Cloudflare Workers — the site you’re reading: type-safe and served from the edge.

Fork it for your own search

The repository is fully generic — there’s no hardcoded personal data in it. Fork it, run the setup, and walk the onboarding to populate your own profile; none of my content lives in the repo.

git clone <repo>
cd career-pilot
bash setup.sh

What it doesn't do

  • It never sends anything on its own — outreach lands as a draft I review first.
  • It doesn’t apply to jobs for me, or talk to recruiters as me.
  • The odds-of-an-offer score is a heuristic that moves as new signals arrive — not a promise.
  • It’s tuned to my search, not packaged as a product (yet) — though it’s built generic so it could be.

Questions I get

Is it actually autonomous, or are you driving it?
Both. It runs on its own on a schedule — scouting roles, watching for replies — and reacts when I chat with it. I approve anything that goes outward.
Did an AI write your résumé?
It tailors my real résumé by selecting and re-emphasizing real experience for a given role. It never invents — every line maps to something I’ve actually done.
Can I see it work on my role?
Yes — Watch it work runs the same agent stack on your company and a role you’re hiring for, live.
Are you tracking me?
Only a first-party visit log — see above. No third-party trackers, no cross-site cookies.
How do you change it without breaking the live search?
Changes ship through a separate, access-gated copy of the whole system first — a simulated recruiter drives it end-to-end so new behavior gets shaken out before it ever touches the real search. And on the live system, shadow mode lets it dry-run an action before that action is ever armed — the same staged-rollout discipline I’d bring to any production system.