Skip to content

Releases: albertosca/moonlighter

v0.1.4 — correctness wave: compliance guard, status sync, location-aware eligibility

Choose a tag to compare

@albertosca albertosca released this 25 Aug 11:24
e13baec

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).

⚠️ Includes two DB migrations (schema v3 → v5), applied automatically with a pre-migration backup on first run.

🤖 Generated with Claude Code

v0.1.3 — InHire, portal archiving and Gmail archive, for real this time

Choose a tag to compare

@albertosca albertosca released this 20 Aug 17:23
40a8e7a

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-Tenant header), staleness re-listing included.
  • Opt-in post-sync Gmail cleanup — archive_ref_matched / archive_all_classified (both default off; unrelated mail 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

Choose a tag to compare

@albertosca albertosca released this 19 Aug 03:33
168283c

⚠️ Erratum (2026-08-21): three items below — the two under Features, and "Portal-feed jobs archive once they age past portal_max_age_days" under Fixes — were merged as hollow commits (a git 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-boards hosts 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 portal_max_age_days (default 30) — not actually in this release, see erratum above; real in v0.1.3
  • Example email paths follow the relative-under-MOONLIGHTER_HOME convention
  • Dead LLM option-picker removed

Features

  • Opt-in post-sync Gmail cleanup: archive_ref_matched / archive_all_classified — not actually in this release, see erratum above; real in v0.1.3
  • InHire 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

Choose a tag to compare

@albertosca albertosca released this 18 Aug 16:47

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 moonlighter umbrella.
  • Sharpened one-line summaries across all five packages.

v0.1.0 — first public release

Choose a tag to compare

@albertosca albertosca released this 18 Aug 16:47

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.