How to Get More Interviews with an AI Job-Hunter
I've argued before about the first goal of artificial systems:
“The first goal of artificial systems is to help every human flourish during their time on Earth: to push back the risk of dying, to do work that feels meaningful, and to reason more clearly when the decisions that shape a life are at stake.”
This post is a small, concrete step toward that goal: getting you into work that's meaningful and fairly rewarded, faster.
Job applications eat time and a lot of energy, so I built a Job Hunter AI agent that automates 98% of the entire process. In 7 days I applied to 31 positions, landed 6 interviews and 3 offers, and took a role at a startup founded by Sam Altman.
Here are the exact steps I followed, so you can replicate it.
I built Hunter π―, a job-hunter agent, on OpenColab: open-source agent orchestration that runs on my own machine. I reach it through Telegram: it reads my CV, finds real jobs, tailors the CV to each one, drives the application form in a real browser, and screenshots the review page before anything is submitted. I stay in the loop for the calls that matter; it handles the rest.
Four moves get you there:
- Install the toolchain: Git, Node, Claude Code, and an OpenRouter key.
- Stand up OpenColab: ignite a project, wire it to a Telegram bot, start the gateway.
- Onboard the agent: hand Hunter its job-hunter brief and let it set itself up.
- Hunt: feed it your CV and start applying.
Everything below works on Linux, macOS, and Windows. Where the OS matters, I call it out.
Before you start: what you’ll need
- A computer you can install software on (admin/sudo rights), with at least 8 GB of RAM.
- A Telegram account on your phone.
- Your CV as a PDF.
- ~30–40 minutes for the one-time setup.
-
Two accounts you’ll create along the way: an
Anthropic account (for Claude Code) and an
OpenRouter account (for the LLM that grades job
matches; Hunter uses
google/gemini-3.1-flash-lite, which is fast and cheap).
Claude Code runs on your Anthropic plan. I recommend the Claude Max subscription: Hunter drives Claude hard during a hunt, and Max gives you the headroom so you don't hit limits mid-batch. If Max is too expensive on your own, split it: invite two friends and share one subscription three ways. OpenRouter is pay-as-you-go, and the job-grading calls are cheap.
Step 1: Install the toolchain
You need four things: Git, Node.js, Claude Code (the runtime OpenColab will drive), and an OpenRouter token.
1.1 Git and Node.js
Open your terminal. You’ll run everything in this section
there, and you’ll need admin rights (the
sudo steps below) to install system packages.
Linux (Debian/Ubuntu):
sudo apt update
sudo apt install -y git curl
# Node.js 20+ via nodesource
curl -fsSL https://deb.nodesource.com/setup_20.x | sudo -E bash -
sudo apt install -y nodejs
macOS (with Homebrew):
brew install git node
Windows: the smoothest path is
WSL2: open an admin PowerShell, run
wsl --install, reboot, then follow the Linux commands
verbatim inside Ubuntu. It gives you the exact Linux toolchain with
none of the native-Windows edge cases. If you’d rather stay
native, install
Git for Windows and
the Node.js LTS installer, then use
PowerShell for the rest.
Verify:
git --version
node --version # v20 or newer
1.2 Claude Code or Cheaper alternative
OpenColab drives a provider runtime; for this build we use Anthropic’s Claude Code (docs). In your terminal, install it and log in:
npm install -g @anthropic-ai/claude-code
claude # opens the CLI
Inside the Claude CLI, run:
/login
and complete the OAuth flow in your browser. This links Claude Code to your Anthropic account so OpenColab can run it non-interactively later.
Cheaper alternative — pi + OpenRouter. Don’t want an Anthropic plan? You can drive OpenColab with pi, a lightweight coding agent, pointed at OpenRouter instead of Claude Code. Install it with:
npm install -g --ignore-scripts @earendil-works/pi-coding-agent
If you go this route, skip the Claude Code install above: you
won’t need an Anthropic account or Claude Max. You’ll
pick openrouter (running
deepseek/deepseek-v4-flash-latest, ~55× cheaper
than Claude) as your provider in Step 2.2. One honest caveat: I
haven’t fully tested Hunter on the DeepSeek model yet, so
treat this path as unverified.
1.3 OpenRouter account + token
The job-hunter uses a small LLM step to grade each posting, a hard
yes / no / maybe against your real constraints, so
you’re not drowning in near-miss listings. Hunter runs this
on google/gemini-3.1-flash-lite
through OpenRouter: fast, cheap,
and more than smart enough to sort a match from a near-miss.
- Go to openrouter.ai and create an account.
-
Add a little credit.
gemini-3.1-flash-liteis cheap enough that €10 covered about four months of use, so you don’t need to load up. - Open Keys β Create Key.
-
Copy the token (starts with
sk-or-...). Keep it somewhere safe; you’ll paste it in Step 2.
Step 2: Stand up OpenColab
2.1 Create the Telegram bot (BotFather)
In Telegram, open a chat with @BotFather:
- Send
/newbot. -
Give it a name (display name) and a
username (must end in
bot, e.g.my_jobhunter_bot). -
BotFather replies with a token that looks like
123456:ABC-DEF....
Keep that token handy; you'll paste it into ignite in
the next step.
2.2 Install and ignite
Back in your terminal, run:
npm install -g opencolab
opencolab ignite
ignite is the interactive first-run setup. It will walk
you through:
-
Project name: call it whatever you like,
e.g.
job-hunt. -
Provider: choose
anthropicfor Claude Code. Economic option: if you installed pi (Step 1.2), chooseopenrouterand set the model todeepseek/deepseek-v4-flash-latestinstead — about 55× cheaper than Claude. -
Reasoning effort: on the cheaper route, set it
to
xhigh. The DeepSeek model is smaller than Claude, and cranking reasoning effort buys back a good chunk of the judgment you’d otherwise lose — it’s the cheapest lever you have for keeping Hunter sharp. - Telegram bot token: paste the token from Step 2.1 when prompted; ignite prints a BotFather reminder right before it asks.
On the OpenRouter route. This option needs your OpenRouter token from Step 1.3. Because ignite sets that key while you pick the provider here, you can skip Step 2.4 — it’s already done. And again: Hunter isn’t fully tested on the DeepSeek model yet, so treat it as unverified.
2.3 Pair with the handshake
Once the token is set, ignite waits for a message from
you to auto-detect your chat. In Telegram:
-
Open your new bot and press Start (sends
/start). - Send it a quick
hi.
That inbound message completes the pairing in one step:
OpenColab reads your chat ID from it and replies with a
confirmation. No pairing codes, no copying chat IDs by hand. Any
text works; hi is just the handshake.
opencolab ignite end to end, project through
Telegram pairing.
2.4 Set the OpenRouter key
In your terminal, give OpenColab the token you made in Step 1.3:
opencolab setup api-key --provider openrouter --api-key sk-or-...
2.5 Start the gateway
In your terminal, start the gateway:
opencolab gateway start --port 4646
This runs in the background by default (macOS/Linux/Windows). Once it’s up, open Telegram and send your bot a quick “hi”. If it replies, the agent is live and wired to the gateway.
That’s the platform up. From here on, you talk to your agent through Telegram; the terminal is just the engine room.
Step 3: Turn the bot into a job-hunter
Right now your bot is a blank OpenColab agent. One prompt turns it into Hunter π―: a sharp-eyed headhunter that knows how to position you.
In your Telegram chat with the bot, send it this instruction:
Read and fully adopt the onboarding prompt at
https://github.com/jimezsa/opencolab/blob/main/other_usecases/JUBHUNTER_ONBOARDING.md, then set yourself up as my job-hunter following it step by step.
The agent will read the brief and start configuring itself. The onboarding covers, in order:
-
Its environment: a job-search CLI
(
jobcli), a headless browser (browser-use+ Chromium) to drive real application forms, LaTeX for CV compilation, and the workflow skills that tie them together. -
Its personality and memory: it writes its
own
IDENTITY.md,USER.md,MEMORY.md, etc., so your preferences persist across sessions. - A short onboarding conversation with you (Step 4).
From here, follow the bot’s lead. It asks one question at a time and tells you exactly what it needs. Your job is to answer and approve.
Heads up: this is the heaviest step: it installs a few tools and clones a repo or two. On Windows, run it inside WSL2. If a tool fails to install, tell Hunter the error; it’s built to work the problem with you.
Step 4: Happy hunting
Once Hunter’s set up, the hunt is a short, repeatable loop:
1. π Hand over your CV. Send it as a PDF. Hunter turns it into a reusable LaTeX master (the blueprint every application gets tailored from) and a search profile (titles, location, languages) pulled from your experience. It proposes your role-type target (working-student, new-grad, senior, contractβ¦) and asks you to confirm.
2. π Log in once. Hunter opens a real Chromium window and asks you to sign into your email, LinkedIn, and the job boards by hand. It never touches your passwords, just reuses the session afterward to apply and pull verification codes.
3. π Search. Hunter runs the full pipeline (search, dedup, hard-reject the obvious misses, LLM-grade the rest against your real constraints) and replies with one clean numbered list of YES matches. No “still searching⦔ spam.
4. π¨ Apply, on your order. You pick the jobs. Hunter tailors your CV to each, fills the form from your profile, uploads the PDF, and screenshots the review page before submitting. The first application is a full manual review: you see the tailored CV and filled form and say “send it” before anything goes out. It never fabricates a field (visa status, GPA, salary, dates): you’re delegating the grind, not your judgment. Trust the flow, and you can let it submit straight after the screenshot.
5. β Proof. Every submission returns a confirmation screenshot and a one-line log (company, role, where), so nothing gets applied to twice.
Repeat step 3 whenever you want a fresh batch. You make the calls, the robot does the typing.
One honest caveat: the agent can make mistakes — a mis-tailored line, a wrong field, a form it reads incorrectly. That’s exactly why the first application is a manual review and every submission returns a screenshot. Treat those checks as yours to run. You are fully responsible for whatever gets submitted under your name. The agent does the typing; the accountability stays with you.
A hardware note. Hunter runs as a long-lived agent, so it wants a machine that stays awake. You don’t need anything powerful: an old laptop or a spare desktop is perfect. Just leave it plugged in and running 24/7. The heavy thinking happens in the cloud models; the local box only needs to stay on to drive the browser and keep your logged-in session alive.
Two portability notes. First, Hunter is built and tested on OpenColab. It may well run on other agent-orchestration platforms (OpenClaw, Claude Cowork, Codex), but I haven’t tested those yet, so treat them as unverified for now. Second, you don’t need a frontier model to run it. DeepSeek and Moonshot both ship frontier-grade models alongside cheaper, lighter ones, and Hunter can in principle run on either tier. For that route, install the pi runtime via its npm option and point it at OpenRouter. I haven’t tested this setup yet either, so treat it as unverified for now.
Recommendation notes
A few notes on how to actually run this without getting burned. Don’t hand it the whole list on day one. Earn the trust, then let it go.
- Apply job by job, one at a time. Point it at a single posting and let it run that one to the finish. You’re not trying to blast the list yet; you’re watching how it behaves on one clean case.
- Review everything for your first five applications. Read the tailored CV, check the form it filled, look at the review-page screenshot before it submits. Five is enough to see whether it’s getting your details right and to catch anything weird before it becomes a pattern.
- When you trust its work, hand it the keys. Tell it to apply end to end, and make the instruction stick so it carries across sessions. Say something like: “from now remember to apply end to end, review the email yourself to create accounts and read new account confirmation emails.” Now it can create the accounts a posting needs and read its own confirmation emails without stopping to ask.
- After that, just chat with the bot to solve problems. It’s an agent, not a script. When something jams (a login it can’t pass, a form it can’t read, a job that looks off) you talk to it the way you’d talk to a person doing the hunt for you.
Build it once. Hunt on your terms.
Under the hood: every skill Hunter runs
Hunter isn’t one big prompt. It’s a set of small, single-purpose skills, each with its own scripts and tools, that the agent picks up as the hunt needs them. If you want to read, fork, or swap a piece, here’s the whole kit, in the order a hunt uses it.
π CV β search profile (jobcli-cv-summary)
Turns your CV into one canonical JSON persona the rest of the
pipeline reads. The agent extracts your job titles (in English and
your local language), location, and search defaults, and writes them
to profiles/<you>/persona_querie.json alongside a
copy of your resume.pdf. No script here: the model reads
the PDF and fills the contract directly. Every later step keys off
this one file.
π¨ CV β LaTeX master (pdf-cv-to-latex)
Rebuilds your PDF CV as editable LaTeX that visually matches the
original: same layout, accent color, header, and language. It leans
on Poppler (pdftotext,
pdftoppm, pdfimages) to pull text, render
pages, and lift embedded images, Pillow to sample
the accent color, and pdflatex (with TikZ) to
recompile. The output is the master .tex blueprint every
application gets tailored from.
π Search + grade (jobcli-job-search)
The retrieval engine. It runs
jobcli,
an open-source Go CLI that scrapes public job listings from
LinkedIn and Stepstone using your
persona_querie.json, pulling hundreds of postings in a
single run. It then dedups against jobs_seen.json and
keeps only the unseen ones. (More boards are wired up but not
working reliably yet, so for now it’s these two.) Then
scripts/job_discriminator.py hands each posting to the
small grading LLM you set up in Step 1.3 (gemini-flash-lite via
OpenRouter) for a strict YES / NO plus a confidence, and
keeps only the YES matches in jobs_yes_high.json.
That’s the clean numbered list you get in chat, no near-miss
spam.
βοΈ Tailor CV to one job (tailor-latex-cv-to-job)
Adapts the LaTeX master to a specific posting while keeping the
original read-only. scripts/create_cv_workspace.py spins
up a per-job workspace and copies the assets; the agent edits only
that copy, recompiles with
pdflatex/xelatex/lualatex,
then scripts/ats_text_check.py extracts the PDF text
with pdftotext and checks it against the job description
for ATS parseability and keyword alignment. Truthful edits only: it
aligns wording, it doesn’t invent experience.
π€ Apply, end to end (apply-to-job)
The orchestrator that ties it together for a single posting.
scripts/create_application_workspace.py lays out an
applications/<date>-<company>-<role>/
folder (job JSON, tailored CV + PDF, ATS report, form-fill log,
screenshots, a one-line STATUS.md). It calls the tailor
skill, drives the form with browser-use, uploads the PDF, and
stops on the review page with a screenshot for your
approval before it clicks submit. Every application is logged to
applications/APPLICATIONS.md, the agent’s memory
of what’s already been sent, so nothing gets applied to twice.
π Drive the browser (browser-use)
How Hunter actually fills forms. It’s
browser-use, a
thin CLI over
Playwright Chromium with primitives the agent runs
one at a time: open, state (list the
numbered interactive elements), click,
input, select, screenshot,
extract, close. Headed when you need to
watch or log in by hand, headless when it’s grinding. This is
the piece that reuses your logged-in session instead of ever touching
a password.