moonlighter¶
The job-application assistant that leaves the last word to you.
Scans the job boards you choose, scores each posting against your profile, and drafts a complete answer sheet from your own data, flagging what it can't answer.
1,700+ tests · 100% branch coverage (CI-gated) · 5 packages on PyPI · mypy strict
moonlighter runs locally and calls your LLM: it scans boards, scores fit and drafts the sheet. Only you paste and send the application to the employer; the reply comes back matched by its +alias.
What it won't do¶
- It never sends an application. It drafts the sheet; you paste the answers into the employer's form and send it yourself.
- Your pipeline lives in a local SQLite file. Jobs, drafts and application history are stored under
MOONLIGHTER_HOME. What leaves your machine is only what goes to the LLM and the APIs you configure — Claude, Gmail, the job boards. PRIVACY.md has the details. - The model never answers a question the guards recognise as salary, compliance or demographic. Those come from your profile or config, or are left to you. The guards match known phrasings, and on the paste path the model still reads the whole page to find the questions.
The model can still get an answer wrong — which is why every sheet is yours to review.
Where to go next¶
- Install — requirements, the setup wizard, and registering the MCP server
- Tailored CV — a one-page LaTeX CV per posting, built from bullets you curated
- Answer bank — screening answers you approved, reused on the next application
- Command line — a JSON CLI per package, for shells and cron jobs
- MCP tools — the 17 tools Claude calls on your behalf
- Extensions — add a job source as a separate package
The decisions behind the design, and what each one cost, are on the Engineering page. Objections and fixes are in the FAQ.
Built by Alberto Cavalcanti — LinkedIn