[1.14.0] — 2026-05-13
3 new ATS adapters land on top of v1.13.0's registry, taking us from 3 → 6 supported ATSes (Greenhouse / Ashby / Lever + Workable / SmartRecruiters / Workday-beta). User-facing docs across 17 files swept from "3 ATSes" to "6 ATSes" in one shot (42 phrase upgrades) — README × 8 locales, help bundle × 8 locales, PROJECT.md. Adds docs/portals-examples.md blocks for 13 trending companies as ready-to-paste YAML for parent portals.yml.
✨ Features
feat(portals): 3 new ATS adapters — Workable, SmartRecruiters, Workday-beta— registry now resolves 6 ATSes (was 3). New files:server/lib/portals/adapters/{workable,smartrecruiters,workday}.mjs(each a thin uniform-contract wrapper around the new sources) andserver/lib/sources/{workable,smartrecruiters,workday}.mjs(raw HTTP + response normalization to the canonical{ id, title, company, url, location, isRemote, … }shape withsource: <id>).- Workable: detects
apply.workable.com/<slug>AND legacy<subdomain>.workable.com. Endpoint:https://apply.workable.com/api/v3/accounts/<slug>/jobs?details=true. - SmartRecruiters: detects
jobs.smartrecruiters.com/<slug>ANDcareers.smartrecruiters.com/<slug>. Endpoint:https://api.smartrecruiters.com/v1/companies/<slug>/postings. - Workday (beta): detects
<tenant>.wd<N>.myworkdayjobs.com/<lang>/<site>. Endpoint: POST to/wday/cxs/<tenant>/<site>/jobs. Defaultssite=Externalwhen the careers_url omits it. Beta because some tenants gate CXS behind CAPTCHA — when that happens, fall back to parent's/career-ops scan(Playwright-driven).
- Workable: detects
📚 Docs
docs(portals-examples): trending boards block—docs/portals-examples.mdextended with v1.14.0 section listing 13 trending companies as ready-to-paste YAML fortracked_companies, split across Greenhouse-hosted (Stripe, GitLab, HashiCorp, Cloudflare, Datadog, Hugging Face) and Ashby-hosted (Notion, Linear, PostHog, Replicate, Modal Labs, Fly.io, Render). Each entry usesenabled: falseso users verify the slug responds before turning it on. Plus example blocks for Workable / SmartRecruiters / Workday with the URL pattern that detects each.docs(framing): 42 ATS-phrase upgrades across 17 user-facing docs— every appearance of "Greenhouse / Ashby / Lever" in user-facing documentation now reads "Greenhouse / Ashby / Lever / Workable / SmartRecruiters / Workday". Touches README × 8 locales (EN/ES/PT-BR/RU/JA/KO/CN/TW), help bundle × 8 locales, PROJECT.md. Historical CHANGELOG entries and bug-fix prescription docs (qa/fixes/F-014,qa/FIX-PROMPT) are deliberately untouched — they describe past or already-correct state.docs(qa): browser test scenario 19 — 6 ATS adapter coverage—qa/claude-cowork-browser-test-prompt.mdextended with Scenario 19:ALL_ADAPTERS.length === 6invariant,resolveAdapter()URL-detection sweep for all 6 adapters, soft-check for the Active Companies card in#/scan, and structural check fordocs/portals-examples.mdblocks per ATS.
🧪 Tests
tests/adapter-registry.test.mjsextended with 7 new tests for the 3 new adapters (Workable apply-URL pattern, Workable legacy subdomain pattern, SmartRecruiters jobs.* + careers.* patterns, Workday tenant.wd5.* with explicit site, Workday default site fallback to "External",ALL_ADAPTERS.length === 6invariant,detectApi()legacy-shape compatibility).- Total: 386 / 386 unit tests (was 379; +7 net). 0 failures.
Verification
npm test # 386 / 386
node -e "import('./server/lib/portals/registry.mjs').then(m => console.log(m.ALL_ADAPTERS.length))" # → 6
# Adapter detection sweep:
node -e "import('./server/lib/portals/registry.mjs').then(m => {
console.log(m.resolveAdapter({ careers_url: 'https://apply.workable.com/foo/' }).adapter.id); // → workable
console.log(m.resolveAdapter({ careers_url: 'https://jobs.smartrecruiters.com/Bar' }).adapter.id); // → smartrecruiters
console.log(m.resolveAdapter({ careers_url: 'https://baz.wd5.myworkdayjobs.com/en-US' }).adapter.id); // → workday
})"
Out of scope (deferred follow-up)
| Item | Notes |
|---|---|
| Per-company adapter records for the 13 trending Greenhouse/Ashby companies | docs/portals-examples.md v1.14.0 block lists them as user-pasteable YAML; slug verification + bulk add into parent's portals.yml is a separate phase.
|
| Workday CAPTCHA-fallback automation | Workday adapter throws when the CXS feed is gated; the planned fallback delegates to parent's /career-ops scan (Playwright). Wiring that into the SPA's "scan" UX is v1.15+.
|