Cover illustration for How to Get More Interviews with an AI Job-Hunter.

August 3, 2026 Β· 11 min read

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.

A grid of confirmation and thanks-for-applying pages from real company portals, one per submitted application.
31 applications in 7 days: every confirmation page, one grid.

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:

  1. Install the toolchain: Git, Node, Claude Code, and an OpenRouter key.
  2. Stand up OpenColab: ignite a project, wire it to a Telegram bot, start the gateway.
  3. Onboard the agent: hand Hunter its job-hunter brief and let it set itself up.
  4. 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.

The pi + OpenRouter setup on deepseek/deepseek-v4-flash-latest.
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.

  1. Go to openrouter.ai and create an account.
  2. Add a little credit. gemini-3.1-flash-lite is cheap enough that €10 covered about four months of use, so you don’t need to load up.
  3. Open Keys β†’ Create Key.
  4. 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:

  1. Send /newbot.
  2. Give it a name (display name) and a username (must end in bot, e.g. my_jobhunter_bot).
  3. 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.

Creating the bot in BotFather, start to token.

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 anthropic for Claude Code. Economic option: if you installed pi (Step 1.2), choose openrouter and set the model to deepseek/deepseek-v4-flash-latest instead — 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:

  1. Open your new bot and press Start (sends /start).
  2. 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.

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Back to blog