Browser AgentsJobOps
The Job Hunt Agent That Refuses to Hit Submit
JobOps finds jobs, tailors a resume for each one and pre-fills the application, then stops and waits for me.
- DiscoverListing repos, HN and a Greenhouse, Lever and Ashby crawl
- ClassifyDeterministic region and start-date rules
- ScoreHeadless Claude rates each job 0 to 5
- TailorLaTeX resume and cover letter per job, with a change log
- Pre-fillGuarded browser agent fills the form in Chrome
- ReviewI check everything and submit it myself
Rochester, N.Y. Applying to new-grad roles is a second job. JobOps is the tool I built for my own search. It finds postings, scores them, writes a tailored resume and cover letter for each one, and pre-fills the application form. Then it stops. A human, me, reviews every application and clicks submit.
Discovery pulls from five sources: two GitHub new-grad listing repos, Hacker News Who is Hiring, a direct crawl of Greenhouse, Lever and Ashby job boards, and one best-effort job site. If one source breaks, the others keep going. The board list grows by itself: any board URL seen anywhere gets added, and dead boards get switched off. The local database now holds over 25,000 jobs, and the board index has passed 900 boards.
The rules live in code, not in the prompt, so the model can't talk its way past them.
Before any AI touches a job, deterministic classifiers handle the easy calls. A tiered region resolver keeps Vancouver, WA and drops Vancouver, BC. A start-date ranker prefers January starts, since I graduate in December 2026. Then Claude Code in headless mode scores the rest in batches of 25 against my profile. The output has to be strict JSON that passes validation, with one retry if it doesn't parse.
For each job I pick, it rewrites my master LaTeX resume and cover letter under a no-fabrication rule, compiles them with a bundled tectonic binary (with up to 3 fix-and-retry attempts), and writes a CHANGES.md so I can see exactly what moved. A voice linter rejects answers with dashes or about 40 AI-sounding phrases and makes the agent rewrite them.
The autofill agent is where the guardrails matter. It's a sandboxed Claude whose only tool is a 316-line guard script. The guard refuses to click submit, apply or send. It refuses sign-ins, account creation and consent boxes. It only navigates to that job's form and only uploads that job's PDFs. Page text is treated as untrusted data, and anything that looks like a prompt injection gets reported. The rules live in code, not in the prompt, so the model can't talk its way past them.
To prove it holds, there's a mock application site with normal and deliberately hard forms, and a self-test that only passes if nothing got submitted. Overnight mode picks the top 10 jobs, tailors each one and leaves every form pre-filled in its own Chrome window, waiting for me in the morning.