Stop losing interviews to a missing keyword.

Free and open source. MIT license, no subscription, no ads, no accounts.

ApplyPack finds real openings, shows exactly which words a posting wants and your resume lacks, helps you fix it in place, and writes the cover letter. On your own machine.

  • Runs locally or in Docker
  • Your data stays in your Postgres
  • 33 kinds of job source
  • Latest release
Live. The app's own scoring module on a synthetic posting and resume. Edit the resume and watch. Open the full demo
—
Job posting green: in the resume · red: a must-have it lacks · grey: a nice-to-have or a passing mention
Your resume, editable the score and the posting react

Type Redis into the skills line: the score moves on the next keystroke. Type hooks, a must-have, and it moves further. Before you type Terraform, its dashed underline in the posting says nothing in the resume backs it. Typed, it counts all the same: the score reads the text, as an ATS filter does.

The whole loop, recorded

The real app on a synthetic resume, with real AI calls and no cuts. Twenty-five seconds.

The Overview, the jobs it ranked, one posting's verdict, the resume compared with it, every suggestion applied in one press (85 to 88, no AI call), the resume as the document itself with the changes marked, the fact-checked letter, and one resume against three postings: 90, 85, and a straight 0 where the stack is PHP.

Why a strong resume gets filtered

The filter counts words, not years.

A resume that says "PHP 8, Laravel, Symfony" can miss a requirement that says "PHP", and a recruiter never sees it.

Half the postings are noise.

The wrong stack in paragraph four, "Remote" that means remote in Germany, a listing nobody will ever fill.

You end up being the cron job.

Refreshing boards, reading, guessing what to change, rewriting the letter. ApplyPack was built during my own search to take that over.

Three things it does for you

Find real jobs, not noise

  • 33 kinds of job source, most of them every hour. Twelve ATS vendors on the companies you pick, twenty aggregators (the monthly HN thread among them), any RSS feed you paste. Starter packs add a whole segment at once.
  • A classifier with rules that burned me. "Full-stack" in a title is not a stack match; "Remote · Germany" is not US-remote. Up to eight searches at once, one AI call per posting.
  • Is it real? A free liveness check first, then a web-search verdict with evidence links: legit, suspicious, fake.
  • Telegram or Discord, only above your fit threshold. A company on your watchlist can alert on every posting instead. Paste a posting from anywhere and it is scored the same way.
The Jobs list: fourteen postings ranked by fit from 92 down, each with its stack, company, place, salary, status and when it was fetched

Fix your resume for this posting. Honestly.

  • Every keyword the posting wants, graded must / preferred / nice and marked present, missing or confirm-with-you.
  • The model marks facts, code computes the score. No core-stack overlap caps it at 30, Vue is not React, and an unknown becomes a question instead of a guess.
  • Apply every suggestion in one press and watch the score move, free of AI calls; each one keeps its own Undo. Or edit side by side, the score updating on every keystroke.
  • See the resume as the document it is. Your own .docx with the edits written into it and marked, ready to download as .docx or .pdf, or saved as v2 with the formatting intact. A PDF, or a layout that cannot be patched, is re-set as a clean single-column .docx in your own font.
  • Disagree with the model? Re-level a keyword, ignore it, add the one it missed, or rebuild the list. Your edits survive every re-run.
Tailor resume: a match score of 85 with the primary stack 3/3, the one edit to make first, editing can reach 88, Apply all suggestions (5), and what the posting is — sector, product, who reads it first

A cover letter that cannot invent

  • Drafted from the posting, your resume and the facts you confirmed. Nothing else.
  • A fact gate reads every claim back against that evidence. A number that is not in your resume never reaches the letter.
  • Pick a tone, add your own angle. About 30 seconds. Edit in place, export PDF or DOCX.
  • Works for a posting that is not stored yet. Paste it or give the URL.
Moved billing off a legacy Rails monolith into Node.js services without downtimefound in the resume
in evidence
Mentored two mid-level engineersconfirmed by you when the comparison asked
confirmed fact
Cut infrastructure spend by 30%in neither the resume nor your confirmed facts
blocked

A blocked claim sends the draft back once with the violation quoted. Still blocked: nothing is stored.

The gate polices the model, not you: your own edits are re-checked as warnings only.

And the rest

  • Applications board. Columns you name, drag and drop, which resume each application went out with, a nudge when one goes quiet for two weeks.
  • Guided first run. Connect an AI, test the search, turn a resume into a profile, switch on the boards for your countries, read the first matches.
  • Seven AI engines with failover. Claude Code, Gemini, Antigravity and Codex CLIs on subscriptions you already pay for, the Anthropic API, any OpenAI-compatible endpoint, and a free model on your own machine through Ollama.
  • Postings cannot hijack the prompt. Every outside text reaches the model inside untrusted-text markers; a test fails the build otherwise.
  • Board discovery. Company boards harvested from HN comments, one click to track.
  • Daily digest and source health. Which boards went quiet, before you wonder.
  • Private by construction. Localhost, no accounts, no telemetry, your own Postgres.

How it works

  1. 33 kinds of sourcemost fetched hourly, from public APIs and feeds
  2. Base filterpure code, zero cost, drops the obvious misses
  3. AI classifierreads the full posting against every running search
  4. Your Postgreson your machine, nothing leaves it
  5. Telegram or Discordwhen the fit clears your threshold (a watched company can alert on every posting)

Cheap deterministic filters drop the obvious misses first, so the AI only reads postings that might be for you.

Scores you can argue with

Most AI resume tools average their way to a flattering number. ApplyPack splits the job: the model only marks what is present, missing or unverifiable, and a unit-tested formula applies the caps.

  • Primary-stack gate. No core-stack overlap caps the score at 30, however good the rest looks.
  • No sibling credit. Vue is not React, PHP is not Node.js.
  • Unknowns stay unknown. The posting wants profiling and your resume does not say? You get a question, not a guess.
  • Honest deltas. v2 is scored by the same code path as v1, so "+16" means something.

The other side of the table: screen a folder of resumes

Off by default, one switch in Settings. Criteria in your own words, names removed before any model reads a word, every answer with its quote from the resume, the score in code, and a person who decides.

I built this during my own job search. It found me a job.

I was mid job hunt when I started ApplyPack. Every evening went to refreshing boards and reading postings that turned out to be the wrong stack, the wrong country, or nobody's real vacancy. So I built the tool I wanted and ran my own search through it every day. That is how I found the job I have now.

It is the same tool you install, unchanged.

Nazar Boyko, September 2026

Free, open source, yours to bend

ApplyPack is MIT-licensed and has no hosted version: no accounts, no subscription, no telemetry, no ads. You bring the AI: a subscription you already pay for, an API key, or a local model that costs nothing.

It is built to be changed. Over 2,600 unit tests on the pure modules, a decision record for every non-obvious choice, and a CLAUDE.md that says where everything lives, so a first change takes an evening, with an AI assistant or without one.

  • Add a job sourceClose to a one-file change: a fetcher template for each feed shape in the repo, a unit test for the mapper, a smoke run.
  • Pick an open issueComment on it before you start, and ask there when the scope is unclear.
  • Bring an ideaOpen an issue with the feature template. Public APIs and RSS only, never scraping; everything else is on the table.

Install in four commands

All you install is Node.js 22 or newer: the database comes with ApplyPack, no Docker needed. Step by step for macOS, Windows and Linux.

git clone https://github.com/applypack/applypack.git
cd applypack
npm install
npm start    # → http://127.0.0.1:4747, the setup opens

On a server, or to keep it running without a terminal: docker compose up -d runs the same thing in containers.

Paste an AI key on the first screen, or let the dashboard detect the CLI you are already logged into. Fetching starts paused until you finish the setup, so a blank profile never burns your quota.

  • Claude Code CLI, your subscription
  • Gemini CLI, free tier
  • Codex CLI, your subscription
  • Anthropic API
  • Any OpenAI-compatible endpoint, LM Studio included
  • Local model through Ollama, free

Engines chain with automatic failover. Consumer-subscription terms do not spell out background services; read yours before making a subscription the primary engine.