Repository navigation
Releases: albertosca/moonlighter
Release list
v0.1.4 — correctness wave: compliance guard, status sync, location-aware eligibility
Never sign for the candidate: declaration/conflict-of-interest/compliance questions are now deterministically guarded — they never reach the LLM and always become an explicit "answer this yourself" gap (#45).
The queue stops lying: Job.status follows Application.status through every writer, with migration m005 backfilling existing drift (#48); closed folded into archived, closed_at alone records why a job left (m004, #46); recently-rejecting companies sink in the listing with a visible "⚠ rejected Nx" badge (#50).
Eligibility sees the structured fields: on-site/hybrid outside the configured base archives without an LLM call; the evaluator prompt now carries Location/Remote type lines and weighs unmet mandatory requirements above relative profile gaps (#47, #49).
InHire grows up: real descriptions from the public detail endpoint and canonical URLs that actually render (#51). A "Github" field fills statically and open_source reaches the prose prompt (#52).
🤖 Generated with Claude Code
v0.1.3 — InHire, portal archiving and Gmail archive, for real this time
Patch release that actually ships what v0.1.2 claimed to. Three feature commits from that release were merged hollow — a git add -u <one file> scoping mistake staged only a config-example doc edit each time, never the real code — so the packages published from v0.1.2 didn't contain them, despite the commit messages and release notes saying otherwise. See the erratum on the v0.1.2 release for the full story.
Same features, same tests, unchanged from what was originally designed and reviewed — now actually in the packages, verified by installing from PyPI in a clean virtualenv and importing the classes directly:
- InHire scanner — Brazilian ATS coverage via the public embed-widget API (
api.inhire.app,X-Tenantheader), staleness re-listing included. - Opt-in post-sync Gmail cleanup —
archive_ref_matched/archive_all_classified(both default off;unrelatedmail is never touched). - Portal-feed age-archiving — jobs from portal sources (RemoteOK, HN Who-Is-Hiring, ...) archive once they age past
portal_max_age_days(default 30; 0 disables) — the only closing signal a portal feed can offer.
No other changes.
v0.1.2 — ten fixes, post-sync archiving, InHire
⚠️ Erratum (2026-08-21): three items below — the two under Features, and "Portal-feed jobs archive once they age pastportal_max_age_days" under Fixes — were merged as hollow commits (agit add -u <one file>scoping mistake staged only a config-example doc edit, never the real code) and were not actually included in this release's packages, despite the commit messages and these notes claiming otherwise. The other seven Fixes and the Packaging item are real and unaffected. The real code for all three, recovered and verified by installing from PyPI in a clean environment, ships in v0.1.3 — upgrade if you need any of them.
Everything the repo's first public day produced:
Fixes
- A partial
email:config block no longer drops sibling defaults (deep merge) - Ad-hoc Greenhouse jobs — EU
job-boardshosts included — now reach the questions API - The assisted flow reads questions from custom Recruitee career domains
- Multi-selects answer every option the profile supports instead of exactly one
- A spend-limit failure aborts remaining composer generations instead of one doomed call per question
- Ref-matched sync updates report the stored job, not the email's guess
- HN Who-Is-Hiring per-comment fetch failures now reach the scan stats
Portal-feed jobs archive once they age past— not actually in this release, see erratum above; real in v0.1.3portal_max_age_days(default 30)- Example email paths follow the relative-under-
MOONLIGHTER_HOMEconvention - Dead LLM option-picker removed
Features
Opt-in post-sync Gmail cleanup:— not actually in this release, see erratum above; real in v0.1.3archive_ref_matched/archive_all_classifiedInHire scanner — Brazilian ATS coverage via the public embed-widget API— not actually in this release, see erratum above; real in v0.1.3
Packaging
- Trove classifiers on all five packages (Python 3.14, AGPL-3.0)
v0.1.1 — bilingual package pages
Metadata-only follow-up to v0.1.0, same code:
- Every package now ships a bilingual PyPI page (English + Português) mapping the five-package family, each slice pointing at its siblings and at the
moonlighterumbrella. - Sharpened one-line summaries across all five packages.
v0.1.0 — first public release
The first public release of moonlighter: the whole job-hunting pipeline as an MCP server for Claude.
- Scan six ATS platforms (Greenhouse, Lever, Ashby, Recruitee, Workable, SmartRecruiters) plus optional remote-first boards, driven by your company list — or ad hoc with
scan_company. - Evaluate every posting against your profile with an LLM; below-threshold jobs archive themselves.
- Prepare complete application answer sheets — from the ATS form API where one exists, from pasted page text everywhere else. You review, you paste, you submit: moonlighter never opens a browser and never submits on your behalf.
- Track employer replies in Gmail, matched back to each application by its tracking alias.
Install: uvx moonlighter · Five packages in lockstep: moonlighter, moonlighter-core, moonlighter-scan, moonlighter-apply, moonlighter-email.
Licensed AGPL-3.0-only; contributions require signing the CLA.