This release adds bulk candidate importing to your CRM, unifies first-party and external job listings on a searchable board, expands the affiliate program with per-job bounties and a new dashboard, and fixes dozens of issues across assessments, contracts, scheduling, and more.
Unify Offers and Contracts into a single Deals surface for easier management, with contracts now in record-only mode.
calendar schedule view, sortable jobs table with company logos
autosave application answers instead of losing them on exit
candidate import wizard (slide-over stepper)
let candidates claim email-only sittings onto their account
EoR estimator quoted ~10% above the price we actually bill
append-only reward ledger replaces the derived balance
Browse all jobs in one place β your open roles and external listings together, filterable by source, location, and company with a new left-side filter rail.
carry a chosen comparison model into the offer composer
in-app estimator renders the same five-model comparison as the public tool
real branded-mailbox seat quotas + apex caution at DNS step
unify Offers + Contracts into one Deals surface + record-only contracts
unify Offers + Contracts into one Deals surface + record-only contracts
client-documents defaults ON β ship the Documents/W-9 hub enabled
client-documents defaults ON β ship the Documents/W-9 hub enabled
add the direct_hire model to the comparison engine
calendar-connection visibility + consent-gated candidate availability
repair verification handoff, recording playback, and provider attribution
repair Google bookings, invisible assessments, raw enum labels
share one tracked-redirect handler; fix cookie domain and bot clicks
bundle 13 read actions to clear the Vercel 2048 route cap
clear 8 type errors blocking validate
replace regex HTML sanitiser with DOMPurify in buildDescriptionHtml
terminate market-listings-backfill infinite loop
transform tsdav in Jest so scheduling-core suites parse
calendar schedule view, sortable jobs table with company logos
autosave application answers instead of losing them on exit
submission packet on review step + firm identity in step 1
candidate import wizard (slide-over stepper)
CSV + XLSX import parsers
export button + import/export wired into candidates board
export CSV builder + >1000-row pagination
export honors board search (?q=), deep-linkable board search
export server action (paginated CSV to R2)
header auto-mapping for import
import server action (upload/preview/commit/progress)
Inngest batch import job with progress + dedupe
object-descriptor registry with candidate object
register crm/import.requested Inngest event
row normalize/validate/dedupe classification
shared descriptor-driven workspace-writer gate
cast xlsx buffer to exceljs's own Buffer param type
catch-block logs the real failure; export search strips _ wildcard; no double-wrap
code-only error throws (no PII), catch logging, poll ceiling, registry-agnostic notes
export row-drop + pagination infinite-loop guards
per-row insert fallback so one bad row can't fail the whole import batch
render export action errors with unscoped translator
surface import DB errors, run-row scope, failed-state, error_rows
type-cast PostgREST results + paginate dedupe + storageKey ownership guard
let candidates claim email-only sittings onto their account
make bulk-invite recipient cap configurable per workspace
per-workspace bulk-invite cap + consolidate bulk-invite feature
send SpeechAce the real audio format, and stop silent provider fallback
EoR estimator quoted ~10% above the price we actually bill
append-only reward ledger replaces the derived balance
durable qualification pipeline with real emitters
per-job Refer & earn bounties
personalised invite landing page + per-campaign links
rebuild the dashboard, drop as-any casts, translate statuses
rollups, payout compliance, suspension, and the remaining surfaces
crm-import namespace (en + es)
per-audience qualification events, attribution window, bot clicks
accept subdomains for mail domains, warn on apex
repair three type errors inherited from the checkpoint base
repair two type breaks the merge surfaced
add canonical posting selection by source trust weight
add cross-source title normalization for posting identity
add exact-tier posting identity resolution
add fuzzy identity tier and insert-race recovery
add posting_identities table and trigram match RPC
add week bucketing and source-independent identity hash
backfill posting identities over existing corpus
collapse cross-source duplicates in the opportunity feed
description_html backfill job + write-on-ingest
per-crawl reaping + board/role cross-links
PII-safe full description extraction + description_html column
resolve cross-source identity during normalize
/jobs board β left filter rail, real facets, prominent search
country-flag location facet + apply-out tracking types
data layer for external listings
external job detail renders via shared JobDetail template
external job detail renders via shared JobDetail template
external openings board + detail pages
Job.source discriminator + listingToJob mapper
Job.source discriminator + listingToJob mapper
JobCard external badge + openings-detail href
JobCard external badge + openings-detail href
JobDetail renders external listings (badge + apply-out)
JobDetail renders external listings (badge + apply-out)
listing sitemap shards + market-company page fallback
searchable, scrollable Company + Location facets
signup gate on jobs browse depth (content stays public)
source filter (all/diiirect/external) on the /jobs board
source filter (all/diiirect/external) on the /jobs board
track apply-out clicks for external jobs (+ open-redirect guard)
unified /jobs board β first-party + external, first-party ranked first
unified /jobs board β first-party + external, first-party ranked first
paginate the jobs board β board payload down ~94%
check post-resolution DB errors instead of writing a wrong zero
close over-merge vector, apply-url loss, and week-bucket drift
count unknown sources and guard the backfill recompute
drop double quotes from backfill migration comments
merge duplicate identity imports in tests
pin identity hash sentinel and add SQL-parity golden digests
stop stripping ambiguous "lead" from identity titles
surface identity-store DB errors instead of returning null
throw on fuzzy RPC error and cover the insert-race winner path
commit the apply-out route (gitignored by out/) + drop stale disable
derive external job category from role slug, not a hardcoded bucket
derive external job category from role slug, not a hardcoded bucket
external job detail matches the first-party layout exactly
external listings keep a reachable apply CTA on mobile, closes #role-apply
external listings keep a reachable apply CTA on mobile, closes #role-apply
external listingToJob postId='' (no apply-bridge), match sibling mapper
external listingToJob postId='' (no apply-bridge), match sibling mapper
job card alignment β inline meta icons, top-right bookmark, crest
resolve country from label tail β live crawl data has null country_code
resolve final whole-branch review findings, closes #live-openings
resolve final whole-branch review findings, closes #live-openings
restore role link + attribution on external detail via footerSlot
restore role link + attribution on external detail via footerSlot
scope no-require-imports disable in the source-branch test mocks
scope no-require-imports disable in the source-branch test mocks
style openings surface with www design system, not webapp tokens
style openings surface with www design system, not webapp tokens