# I built a Claude Code workflow that finds jobs, tailors my CV and fills the forms

> Source: <https://dev.to/deadstar/i-built-a-claude-code-workflow-that-finds-jobs-tailors-my-cv-and-fills-the-forms-ghg>
> Published: 2026-10-18 08:40:31+00:00

Job hunting is mostly the same chores on repeat. Find a posting. Check it is still open. Rewrite your CV for it. Write a cover letter. Hunt for an email address, or fight with an application form.

Claude Code can do almost all of that. It can read a posting, rewrite a CV, draft an email, and with a browser it can even fill in a form. It could, in principle, go the whole way: email the company, submit the application, sign up on a job site.

But language models are unpredictable. One might invent a number on your CV, pick the wrong contact or send something you would never have approved. Once an email is out you can't take it back, and it carries your name.

That is why I built Handoff.

Handoff does the tiring chores for you. It searches the sites you choose, opens each posting and checks it is still live. It tailors your CV and writes a cover letter from facts you wrote. It finds a contact address that really appears on the company's page, drafts the email and fills in the application form in a real browser. It reads your mailbox for replies and reminds you to follow up.

Then it stops right before anything that can't be undone. It is an open-source workflow where Claude Code does the work, and you press the final button.

*Everything in these screenshots is made-up demo data: a fictional person and fictional companies.*

The assistant can **draft, fill and record**. It cannot **send, submit, create accounts, type passwords or read my vault**.

I did not leave that to a prompt that says "please don't". The assistant and the human use different interfaces. The assistant's tools simply have no way to send an email or press Submit. Those steps live in a dashboard that only I use. A database check also blocks any job state change that skips the rules.

``` php
Claude Code --(MCP, stdio)--> Handoff MCP server --> SQLite database (on your computer)
     |                                                      ^
     +--> Playwright MCP --> shared Chromium                |
                                                            |
Dashboard (127.0.0.1) <-- HTTP server ----------------------+
     +-- Vault (encrypted: mail login, site passwords)
```

`127.0.0.1`.
**1. You write your facts once.**

You enter your jobs, projects, education, skills and true statements about your work. Everything the assistant writes comes only from these.

**2. It finds jobs.**

`/discover` searches the sites you choose, opens each posting, checks it is still live and scores it against what you said you want. If you already have links, `/add <link>` takes them.

**3. It tailors your CV and cover letter.**

`/tailor` builds a CV PDF and `/cover` writes a letter. Every claim has to cite one of your facts, and every number has to match it. Each CV also gets an ATS-style score with the keywords it is missing.

If a job asks for a skill you don't have, it shows up as a **gap**. You can say what you really did, or have the assistant draft it from facts you already saved. Nothing is saved until you press a save button.

**4. It applies, up to the last click.**

For email, `/email` finds a contact address that really appears on the company's page, checks the domain takes mail and drafts the message. For forms, `/apply` fills the application in a real browser and leaves the tab open.

**5. You review and press the button.**

Everything that needs a person lands in one place. You edit the email and send it from the dashboard. You read the form and press Submit yourself.

**6. It follows up.**

The dashboard reads your mailbox (read-only), matches replies to your jobs and reminds you when to follow up. Possible matches are suggestions for you to check, and nothing moves by itself.

If you want to skip the middle, `/go <id>` takes one job as far as it can and then stops for you.

Nothing is trained. But everything you teach it is kept in a local file and reused. Close a gap once and every later CV can use it. Answer a form question once and it is filled in next time. A bullet with no number becomes a card you answer once.

One SQLite file, a dashboard on `127.0.0.1` and an encrypted vault for your mail login. Nothing is sent to a Handoff server, because there isn't one.

You need Node.js 20 or newer, Claude Code signed in and a Chromium-based browser. A Gmail app password is optional, for sending email and reading replies.

```
git clone https://github.com/DeazStar/handoff
cd handoff
npm install
npm run build
cp .mcp.json.example .mcp.json         # tells Claude Code where the tools are
npx playwright install chromium        # once, for form filling
npm start -w @jobhunt/server           # prints a dashboard link
```

Then:

```
/add https://example.com/jobs/123 go
```

Then look at **Needs you** in the dashboard.

**Want to look around first?** There is a made-up demo job hunt that needs none of your own data:

```
JOBHUNT_HOME=/tmp/handoff-demo npm run demo:data
JOBHUNT_HOME=/tmp/handoff-demo JOBHUNT_NO_BROWSER=1 JOBHUNT_NO_DRAFTER=1 npm start -w @jobhunt/server
```

The demo refuses to run if the folder already has a profile, so it can never mix with real data.

| Type | What it does | 
|---|---|
| `/discover` | Search for jobs that fit your settings | 
| `/add <link>` | Add job links you already have | 
| `/tailor <id>` | Build a tailored CV | 
| `/cover <id>` | Write a cover letter | 
| `/email <id>` | Find a contact and draft the email | 
| `/apply <id>` | Fill an application form (never submits) | 
| `/go <id>` | Take one job as far as it can, then stop for your review | 

Making it work for any profession, with swappable packs for CV sections and writing examples, and an easier first-run setup. If you work outside software, I would love to hear what a good CV and message look like in your field.

**Repo:** [github.com/DeazStar/handoff](https://github.com/DeazStar/handoff)

**Guide:** [How to apply for jobs with Claude Code](https://deazstar.github.io/handoff/apply-for-jobs-with-claude-code.html)

If you try it and something breaks, open an issue and tell me what you were trying to do. That is the most useful feedback I can get right now.
