Skip to content

Releases: pvega62/sweepy

Sweepy v3.0.0

Choose a tag to compare

@pvega62 pvega62 released this 23 Oct 18:30

Sweepy 3.0.0 release notes

Highlights

Released 2026-10-23. See the full changelog.

  • Scrapers share one adapter and run concurrently instead of in sequence
  • Download HireHunt, openroles, jobdrop, or Apify from inside the wizard
  • A timeout and a circuit breaker per engine, so one unresponsive board can't stall a sweep
  • Results from every engine normalized, deduplicated, and cached for an hour
  • Sweeps return new postings only, and hide repeats for four days
  • Profiles built or updated from flags, with no prompts
  • Match percentages now reflect how much of a posting your resume actually covers
  • Attach a separate resume to each resume track and score every job against its routed track's resume
  • Score a .docx resume directly, with no conversion step
  • Keep live postings that rate limiting used to delete
  • Convert a Word resume to PDF right inside the setup wizard
  • Create or edit a profile from the setup wizard's new main menu
  • Update Sweepy from the command line or the wizard menu when a newer version becomes available
  • Exit the wizard cleanly with Ctrl+C

New in 3.0.0

  • Job engines. Sweepy now runs every enabled engine concurrently through one adapter contract. Sweepy bundles jobspy and the built-in applicant tracking system readers. HireHunt, openroles, jobdrop, and Apify install on demand. sweepy --list-engines shows what each engine scrapes and whether that engine has a local install. sweepy --install-engines all downloads the compatible optional engines. jobdrop needs the explicit conflict override described below.
  • Engine downloads in the wizard. Sweepy's Toolbox then Download job engines lists each engine with its boards and install state, then installs on confirmation. Picking a missing engine while building a profile offers the download right there. The engine review screen sets per-engine choices and accepts a proxy with the password masked.
  • Engines install as extras. requirements-engines.txt holds the optional packages, and pyproject.toml publishes engines, apify, and all-engines extras. An adapter imports its library at call time and prints the install command instead of breaking startup.
  • Engine settings per profile. sources.enabled picks the engines, each engine block sets its own options, and orchestrator and cache control timeouts, the circuit breaker, and result caching.
  • Headless profiles. sweepy --setup --non-interactive --sources jobspy,openroles --openroles-companies figma,stripe ... writes a validated profile without prompts.
  • run_sweep now reports skipped_sources, so a caller can see which engine timed out or tripped its circuit breaker. create_profile accepts a sources_config block, plus cache_config and orchestrator_config for cache lifetime, per-engine timeouts, and circuit-breaker behavior.
  • Background sweeps. run_sweep answers within wait_seconds, 45 seconds by default, with sweep_status: "running" and a job_id. get_sweep_status waits in bounded slices until the sweep completes. A sweep keeps running after the client disconnects, and a repeat call for the same profile rejoins it.
  • New postings only. Sweepy records every posting it reports in ~/.sweepy/history.db and hides that posting on later sweeps for four days. Set history.enabled: false in the profile, or pass --include-seen, to see every posting on every run. sweepy --reset-history clears the record.
  • Wizard main menu. sweepy opens the launchpad before the questionnaire. Create or edit a profile, toggle debug logging, adjust the scoring weight and report scaling, or add and edit aggregators. The header shows the loaded profile and its job-title count, and sweepy --setup --profile profiles/your_profile.yaml opens the wizard with that profile loaded.
  • Self-update. sweepy --update pulls the newest code and reinstalls dependencies, including the optional engines a checkout already had. sweepy --check-update reports whether a newer version exists. The update leaves a checkout with uncommitted changes untouched.
  • Per-track resume scoring. resume.tracks[].path points each track at its own resume, and the setup wizard collects a path for each track. Jobs route to a track by keyword, then score against that track's resume.
  • Wizard resume-path hint. The resume question prints the shortcut that copies a file's full path for your operating system. Use Ctrl+Shift+C in File Explorer on Windows 11, Option+Command+C in Finder on macOS, or Ctrl+Shift+C in most Linux file managers.
  • Wizard DOCX-to-PDF conversion. Enter a .docx resume and the wizard offers to convert it. A "Convert a DOCX to PDF" choice in the review menu does the same on demand.
  • A navigation help banner in the wizard, plus "Show help" and "Show recent logs" review-menu choices. Ctrl+C cancels setup without a traceback.
  • .docx resume support. Sweepy reads a .docx with python-docx, and create_profile accepts either format.
  • Profile synonyms. resume.synonyms lists groups of interchangeable terms, and create_profile accepts a synonyms argument. A posting that writes documentation as code then matches a resume that writes docs-as-code, in either direction.
  • Wizard navigation. Submenus open with ← Back, and Esc goes up exactly one level. In a question, Esc returns to the previous answer. At a submenu, it returns to the parent menu. On the launchpad, Esc exits the wizard. The toolbox runs as its own menu level, so leaving engine, aggregator, or help screens returns to the toolbox instead of the launchpad. Ctrl+C still quits from anywhere.
  • The launchpad shows six tiles in three even rows, including a new Exit Sweepy tile. A trailing odd tile centers itself.
  • The platform step lists every board Sweepy can search, grouped by engine. All 63 boards appear, with per-engine counts: jobspy 8, ats 5, hirehunt 12, openroles 4, jobdrop 33, apify 1. Each row shows its engine and whether that engine needs a download, so Wellfound [jobdrop · needs download] says so before you tick it. Choosing boards from an engine with no local install prints the install command.
  • --install-engines all no longer includes jobdrop. jobdrop reports an older curl-cffi pin than JobSpy needs, so pip can't resolve both at once. The pin lags the library: jobdrop runs on the newer release. Add --allow-engine-conflicts to install it beside JobSpy, which keeps JobSpy's curl_cffi import.
  • Install sizes, per the README. Core takes 283 MB and the compatible engines about 310 MB. jobdrop adds 406 MB, which brings a forced total to about 715 MB before it downloads a browser.

What changed

  • Match scoring now measures coverage both ways. Your keywords that appear in the posting supply 40% of the score. Requirements the posting states and your resume already covers supply 60%. The old score divided resume-keyword hits by the whole keyword list, which always ran low. An earlier comparison of 26 postings raised the mean from 17.8 to 31.4. Alias and priority refinements followed. Those still need evaluation against human relevance labels.
  • Explicit required terms now outweigh preferred terms. Deterministic matching also recognizes regular plurals and selected acronym expansions. It applies the synonym groups you declare in resume.synonyms. These scores rank postings by shared vocabulary.
  • Descriptions stay on by default. Scoring needs posting text, so fetch_descriptions now defaults to true for jobspy and jobdrop. Turning it off trades match quality for speed.
  • JobSpy sends a current Chrome User-Agent by default, and each engine block accepts its own override.
  • Sweepy reads a Word resume correctly. pymupdf used to open the .docx ZIP without error and return reordered, partial text. The same resume scored differently as DOCX and PDF, differing on 17 keywords. Sweepy now also flattens hard-wrapped lines before it reads tokens and phrases. A PDF's line breaks no longer fragment multi-word skills such as First Aid. Both formats agree on 81% of keywords, and one wrapped skill phrase accounts for the rest.
  • Keyword extraction stops splitting skills on commas inside parentheses, so Adobe Suite (InDesign, Acrobat) no longer becomes (indesign and acrobat). It also merges case duplicates such as CSS/css, and drops months, date ranges, employer names, and stopword-led fragments. Unmatchable keywords fell from 67% to 43% of the set on a real resume.
  • The 60-keyword cap now keeps the strongest signals instead of the alphabetically first terms. The old cap discarded python, react, and sql while keeping (indesign.
  • URL validation no longer deletes live postings. Sweepy keeps a posting answered with 403, 408, 425, 429, or a 5xx and marks it unverified. A measured HEAD request returned 429 while a GET on the same URL returned the full 312 KB job page.
  • data/sources/ashby_orgs.txt drops three stale org slugs that returned 404 on every run.
  • DOCX-to-PDF conversion now reads tables in document order. The rebuilt PDF keeps the same text as the DOCX.
  • Existing profiles keep working. A profile without sources.enabled resolves to JobSpy plus the native ATS readers, and legacy board booleans under sources.jobspy still apply.
  • The README drops the table of contents. The package sizes now sit under Job engines as Disk footprint. A new Agent judgment section covers the agent workflow, the background sweep, and the install state MCP-created profiles inherit. It links to the MCP integration guide for the setup steps. A separate guide, Scoring and limits, covers what deterministic scoring misses.

Fixed

  • The wizard now attaches a distinct resume to each resume track instead of only the first one.
  • One failing engine no longer empties a sweep. Sweepy isolates every engine error, timeout, and o...
Read more

Sweepy v2.3.0

Choose a tag to compare

@pvega62 pvega62 released this 15 Oct 18:08

Highlights

  • Convert a Word résumé to PDF without installing anything else
  • Sweep without an LLM key and still get useful match percentages
  • Review and correct every wizard answer before you save a profile
  • Turn on debug logging from the command line or the wizard
  • Install the bundled /sweepy skill in a skill-aware CLI
  • Score LinkedIn and ZipRecruiter postings again

What’s new

  • DOCX-to-PDF conversion through python swee.py --docx resume.docx and the new convert_docx MCP tool.
  • The converter rebuilds the PDF with python-docx and reportlab, then falls back to Microsoft Word through docx2pdf. A blank output path saves the PDF beside the source DOCX.
  • Opt-in debug logging through --debug, debug: true in a profile, or SWEEPY_DEBUG=1. Logs rotate under logs/, and python swee.py --logs prints the newest entries.
  • A wizard review screen that lists every answer. Edit one answer or start over before you save.
  • Track color values accept a CSS name such as navy, not only a hex code.
  • A bundled /sweepy skill at skills/sweepy/SKILL.md, plus a README prompt to install it.

What changed

  • Deterministic keyword extraction now pulls a Skills section, frequent résumé terms, and capitalized phrases into the match set. The merged list caps at 60 keywords.
  • Scoring searches the job title and the description, which raises match accuracy without an LLM.
  • The jobspy fetcher uses fetch_description=True in place of the deprecated linkedin_fetch_description. LinkedIn and ZipRecruiter descriptions return again. Those roles now score instead of returning empty text.
  • Every source module now sends Sweepy/2.3 in its User-Agent header, up from Sweepy/2.2.
  • The wizard now prompts you to enable debug logging.

Fixed

  • Ashby fetches treat an HTTP 404 from a stale org slug as an empty result instead of raising through discovery.
  • A profile with report.max_cards: 0 now renders every card. The old fallback silently capped unlimited reports at 24 cards.

Impact

Sweepy now works as well without an LLM key as it does with one. The new keyword and title signals raise no-key match accuracy. Restored LinkedIn and ZipRecruiter descriptions put more postings in front of you. The wizard review screen stops one typo from costing you an entire setup run. An unlimited report now renders every match instead of stopping at 24 cards.

See the full changelog: https://github.com/pvega62/sweepy/blob/main/CHANGELOG.md

Sweepy v2.2.0

Choose a tag to compare

@pvega62 pvega62 released this 15 Oct 03:49

Highlights

  • Greenhouse and Lever now run by default, with no API key required
  • More predictable source control through explicit enabled flags
  • Better title filtering to keep sweeps focused and faster
  • More reliable exports, including safer PNG fallback behavior
  • Expanded docs for résumé formatting and keyword matching

What’s new

  • Added deterministic source support for Greenhouse and Lever
  • Added default seed lists for additional boards and company targets
  • Enabled all five built-in deterministic sources by default
  • Centralized shared source helpers for HTML cleanup and title matching
  • Updated source request metadata to use a shared Sweepy user agent

What changed

  • Each source now respects both source-level and platform-level enablement flags
  • Source discovery accepts platform configuration directly
  • Greenhouse and Lever requests are filtered by profile title matches
  • README guidance was expanded for best-practice résumé formatting and keyword strategy

Fixed

  • PNG export now fails gracefully without stopping CSV/JSON output generation

Why it matters

Sweepy is more reliable out of the box, easier to customize, and better aligned with how users actually manage job searches and résumé optimization.

See the full changelog: https://github.com/pvega62/sweepy/blob/main/CHANGELOG.md