Remote jobs from Remote OK, We Work Remotely and Jobicy in one deduplicated JSON feed. Salary and keyword filters, only-new-jobs mode. $1 per 1,000 jobs.
BREAKING (default change):maxTotalJobs now defaults to 8 (was 0, no limit), in the input schema and in code when the field is left out. Set it to 0 for the old full pull. Before this, an empty input pushed about 2,000 jobs and took about 4 minutes. If you used a pre-release build whose default was 50, the default is now 8, so runs that left the field empty return 8 jobs instead of 50.
BREAKING (output default change):includeDescription now defaults to false (was true), so descriptionText and descriptionHtml are no longer in the output unless you turn it on.
With a maxTotalJobs cap and no filters or monitoring mode, each board now stops after 2x the cap instead of reading every page (Jobicy then needs one request instead of up to 50). The boards list newest first, so the result is the same newest jobs; per-source found counts in RUN_SUMMARY are smaller and show stoppedEarly.
Default mode: when no sources and no filters are given (or all three sources, as in the form prefill) with the default cap, the log says Default mode: ..., RUN_SUMMARY has defaultMode: true, and the status message starts with Default mode (newest 8 jobs, no filters): .
Lint only: removed unused imports in common.py and feeds.py (pyflakes clean). No behaviour change.
2026-10-29: one vocabulary for employmentType
Breaking for exact-value filters:employmentType is now always one of the schema.org values FULL_TIME, PART_TIME, CONTRACTOR, TEMPORARY, INTERN, VOLUNTEER, PER_DIEM, OTHER, or null, the same vocabulary as the ATS job scrapers. Before, each board's own spelling was passed through (Full-Time, Full time, Contract).
The board's own text is kept in the new field employmentTypeRaw. When a board lists several types, the more specific one wins (Full-Time, Contract is CONTRACTOR). A value that fits none of the types (such as Permanent) becomes OTHER.
Remote OK's salary fields are meant to be yearly USD, but some employers enter an hourly rate there. A Remote OK range whose top is $500 or less is now labelled HOUR in salaryPeriod; everything else stays YEAR.
2026-10-29: robots.txt on every redirect
Redirects are now followed one hop at a time (up to 5), and robots.txt is checked for every hop. A host whose robots.txt can't be read (a server error after one retry, a network failure, or an HTML page served as robots.txt) is skipped for the run with a warning. A missing robots.txt (any 4xx) still means no rules.