AppliedIn

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.

The AppliedIn pipeline. Stage 0 Discover routes a watchlist and preferences through either a deterministic ATS feed or a Chrome crawling agent, then filters, scores and dedupes into a job queue. Stage 1 Match Scorer is a single model call producing a score from 0 to 10, stopping anything below the bar. Stage 2 Résumé Tailoring loops a tailor agent against a critic agent for at most two passes, validating facts and compiling a PDF. Stage 3 is human approval, where the run pauses. Stage 4 Application Agent is a ReAct loop of observe, act and verify running in the owner's own Chrome, with a duplicate guard and no blind retry, uploading to a hidden file input rather than an operating system chooser. The outcome is either a confirmation, a question for the owner, or a stop for human verification.
Sequential orchestration with one human gate. Full size: light, dark.

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

ForYou 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.