ImprovementFix

Faster ranking and sturdier resume parsing

Embeddings now run on Voyage with OpenAI as a fallback, and the parsing pipeline stopped giving up on the awkward files recruiters actually receive.

Screening a batch is only as good as the weakest file in it. A single malformed PDF used to be enough to stall a run, and re-ranking a job meant recomputing embeddings that hadn't changed.

Multi-provider embeddings#

Resume and job embeddings are generated by Voyage, with OpenAI kept as an automatic fallback. The schema now records which model produced each vector, so a provider can change without invalidating everything already stored — and matches keep improving without a re-upload.

Parsing that survives real files#

  • Scanned and image-only PDFs fall through Textract → Google Vision → local parsers instead of failing on the first miss.
  • Textract now receives document bytes directly, removing an S3 round-trip from every upload.
  • DOCX files that previously failed silently return real text, and corrupt PDFs surface a clear error on the resume instead of stalling the batch.
  • Very long resumes are truncated to fit model limits rather than being rejected.

Fewer dead ends#

"Resume is too short" is now shown on the resume itself, so you can see which upload needs a better copy. Uploading on the landing page without an account works again, and the job you were drafting is kept while you sign up.