Local job application agent
Applying to jobs is mostly retyping.
The same name, the same phone number, the same “why are you interested in this role”, a hundred times over, until you stop applying to good roles because the form is tedious.
AppliedIn does the retyping. It finds roles worth your time, tailors your résumé to each one, fills the employer’s form in your own browser, and stops for you only where a person is genuinely required.
The board below is the real dashboard, running on sample data so you can click through it. Open the demo.
It runs on your machine. Your résumé, your answers and your history stay on your disk. Nothing is uploaded anywhere except to the employer you are applying to.
One run, unedited
23:01:13 discovery scoped to 1 company: NVIDIA
23:01:25 discovery nothing from the plain fetch, reading the page in the browser
23:15:13 chrome 60 posting(s), page is a workday wrapper
23:16:12 pipeline skipped nvidia#8933826: score 6 < 7
23:22:04 tailor Senior Engineer, AI Agents and Systems, score 9
23:41:55 browser ↪ the form is embedded, applying on the board directly
23:44:02 browser ✎ set 25 fields, résumé attached
23:44:18 applied “Thank you for your applying. Your application is under review.”
How it works
Three stages, in order. Every step is visible on the board as it happens, and says what it did and why.
01
Find
Reads the boards of companies you follow, screened against what you asked for: titles, seniority, locations, the topics that raise fit and the ones that never do.
02
Tailor
Rewrites your own LaTeX résumé toward each posting’s vocabulary, never inventing an employer, a metric or a skill. You get a diff of exactly what changed.
03
Apply
Fills contact details, work authorisation, dropdowns and free text answers, then reads the page, and records an application only when the employer confirmed one.
Why your own browser
A driven browser has never been anywhere. No history, no cookies the site has seen before, and a fingerprint that reads as automation. So the pages that matter push back: a security code on one posting, “your submission was flagged as possible spam” on the next. A form filled perfectly still does not go out.
That is a browser problem, and no amount of work on the form logic fixes it. So AppliedIn does not open its own browser. It works in the one you already use, with the sessions you are already signed into. You watch it happen in a tab.
Finding and tailoring
your OpenAI key
Filling the form
your own Chrome
Résumé and answers
your disk, nowhere else
The graph
Five stages, each a different shape of agent, because they are different kinds of problem. Discovery routes between a deterministic feed and a browsing agent. Scoring is one model call. Tailoring is a writer and a critic in a bounded loop. Applying is a ReAct loop over guarded tools. The only stage that is not automated at all is the one where you approve.
Tool routing, not a single agent
A board with an API is read over HTTP: complete, fast, free. Only a careers page that will not yield to that gets a browsing agent. Reaching for the expensive tool first is how a pipeline becomes slow everywhere.
A critic with a budget
The tailor writes, the critic reviews, and the loop is capped at two passes. Every bullet is kept and every claim is checked against the original, so the résumé that comes out is still yours.
The tools carry the rules
The application agent cannot type a placeholder, declare a protected characteristic, or affirm a sanctions question, because those are refused at the tool boundary rather than discouraged in a prompt.
Three honest outcomes
Confirmed, needs you, or uncertain. There is no fourth branch where it assumes the application went through, which is why a run that cannot prove a submission reports that instead of claiming one.
Guarantees
These are checked in code, not asked for in a prompt, because a rule that is only a sentence in a prompt is a rule nobody is enforcing.
It never declares something about you
Disability, veteran status, race and gender are voluntary and yours to answer. Unless you have answered one yourself it stays blank, while your own negative answers still go through, so a required field ends up correctly declined rather than empty.
It never applies twice
A duplicate under your real name is worse than a missed application. A job already marked applied is refused before the browser even opens.
It never claims what it cannot prove
Clicking Submit and hoping is not a submission. Without a confirmation the page actually showed, the run is reported as unknown, never as done.
It never answers a sanctions question wrongly
Export control questions always take the safe option, whatever anything else decided. Getting one wrong is not a bad application, it is a false statement.
It never solves a CAPTCHA
When a bot check appears the run stops and hands you the page. That boundary is deliberate.
It never invents an answer
If a required field has no answer you approved, it asks rather than guessing, and remembers what you say, so it never asks twice.
When it asks you
“The form is filled apart from these. What should they say?”
An unknown field does not abandon the application. Everything answerable is filled first, then it asks, so you finish in ten seconds instead of doing the whole form by hand. Your answer is remembered, so it is never asked twice.
Get started
# one key to start, everything else has a default
cp .env.example .env
./setup.sh
./appliedin start → http://127.0.0.1:8787
Put your résumé’s LaTeX in resume/base.tex, list the employers
you care about in config/watchlist.yaml, and set your criteria in
the dashboard. Then press Discover.
Requirements
| For | You need |
|---|---|
| The pipeline | Python 3.12, Redis, Chrome, an OpenAI API key |
| Filling forms in your browser | Claude Code and a direct Anthropic plan. The Chrome integration does not accept API keys. |
Caveats
Published for learning. This is a personal project to read and build on, not a product or a service.
- Applications go out under your name. Read them before they are sent. An application you did not check is still one you signed.
- Employers’ terms may prohibit automated applications. Check them. Where you point this, and whether you should, is your call and your responsibility.
- It gets things wrong. The failure modes are documented rather than hidden, which is the most useful thing about reading the code. No warranty.