A job search runs long enough that the record of it becomes worth more than any single application: who you spoke to, what they asked, which board a recruiter came from, whether you already applied to this company once before. Most of that ends up in a spreadsheet, which has columns but no room for the substance — and a grid of cells is an awkward thing to hand an LLM to read and edit.
vacancy-radar answers the questions that actually come up mid-search. What has gone quiet? What is waiting on me this week? Did I already apply to this company, and how did that end? Who was the recruiter there, and have they moved since? You ask in plain language, because the vault attaches to whichever LLM client you already work in — so logging an application, or chasing a stalled one, is a sentence rather than a form.
Underneath it is markdown files in a folder that belongs to you. Readable without the tool, greppable, committable — a diff shows exactly what changed and when. Nothing is locked in a database, and the search finds things you only half remember rather than only the words you typed.
How that works — a derived index doing hybrid keyword and semantic search, an MCP server, and no LLM inside the package at all — is what the write-up below is about, including the first version I built and threw away.
Open source on GitHub and published to PyPI — pip install vacancy-radar, Python 3.12+. How it got built, and what I threw away on the way: Turning a job search spreadsheet into a local-first vault.