Skip to content

feat: Create a candidate by dropping in their CV - #257

Merged
JoachimLK merged 2 commits into
mainfrom
feat/cv-drop-to-candidate
Aug 4, 2026
Merged

feat: Create a candidate by dropping in their CV#257
JoachimLK merged 2 commits into
mainfrom
feat/cv-drop-to-candidate

Conversation

@JoachimLK

Copy link
Copy Markdown
Contributor

Adding a candidate meant retyping the name and email that the CV already states — createCandidateSchema requires them, and nothing read them off the document. Text extraction already existed (resume-parser) but only ran against candidates that had been created by hand first.

Drop a CV on the add-candidate form and the contact fields fill in. The file is held client-side and attached as the résumé only once the record exists, so a bad extraction leaves no candidate and no orphaned upload behind, and the recruiter confirms every value before anything is written.

Extraction is deliberately narrow — contact details only, capped at 12k characters. Scoring already reads the full résumé text.

Works with any CV, including LinkedIn's "Save to PDF" profile export, which is the supported way to get LinkedIn data in: the Recruiter APIs need a Corporate licence on the customer's side, and scraping breaches LinkedIn's terms.

Summary

  • What does this PR change?
  • Why is this needed?

PR title must follow Conventional Commits — e.g. feat(jobs): add bulk import or fix: handle null salary. The squash-merged title is what release-please uses to generate the changelog and pick the next version. PRs with non-conventional titles are blocked by CI.

Type of change

  • Bug fix
  • Feature
  • Refactor
  • Docs
  • Chore

Validation

  • I tested locally
  • I added/updated relevant documentation
  • I verified multi-tenant scoping and auth behavior for affected API paths

DCO

  • All commits in this PR are signed off (Signed-off-by) via git commit -s

Adding a candidate meant retyping the name and email that the CV already
states — createCandidateSchema requires them, and nothing read them off the
document. Text extraction already existed (resume-parser) but only ran
against candidates that had been created by hand first.

Drop a CV on the add-candidate form and the contact fields fill in. The
file is held client-side and attached as the résumé only once the record
exists, so a bad extraction leaves no candidate and no orphaned upload
behind, and the recruiter confirms every value before anything is written.

Extraction is deliberately narrow — contact details only, capped at 12k
characters. Scoring already reads the full résumé text.

Works with any CV, including LinkedIn's "Save to PDF" profile export, which
is the supported way to get LinkedIn data in: the Recruiter APIs need a
Corporate licence on the customer's side, and scraping breaches LinkedIn's
terms.

Co-Authored-By: Claude Opus 5 <noreply@anthropic.com>
@coderabbitai

coderabbitai Bot commented Aug 4, 2026

Copy link
Copy Markdown

Warning

Review limit reached

@JoachimLK, you've reached your PR review limit, so we couldn't start this review.

Next review available in: 18 minutes

You've used all free OSS reviews for now. Wait for the free limit to reset to keep reviewing this public repository.

How can I continue?

After more reviews become available, a review can be triggered using the @coderabbitai review command as a PR comment. Alternatively, push new commits to this PR.

To avoid repeated limits, reduce automatic review volume by pausing incremental auto-reviews earlier, using label-based review opt-in, excluding WIP or generated PR titles, or requesting reviews manually when the PR is ready. If your team needs uninterrupted high-volume reviews, an organization admin can enable usage-based reviews.

How do review limits work?

CodeRabbit enforces per-developer PR review limits for each organization. Most developers receive the normal plan review availability.

For paid Pro and Pro+ PR reviews, CodeRabbit uses adaptive limits for sustained high-volume activity. When a developer's recent PR review activity reaches the 95th percentile or higher among CodeRabbit users, additional reviews become available more gradually as earlier reviews age out of the rolling window.

Please refer docs for additional details.

Review details
⚙️ Run configuration

Configuration used: defaults

Review profile: CHILL

Plan: Pro Plus

Run ID: 2af165d3-ebfb-4031-8044-84cbdeff810f

📥 Commits

Reviewing files that changed from the base of the PR and between 2c2b894 and 43d6fc0.

📒 Files selected for processing (5)
  • app/components/ApplyCandidateModal.vue
  • app/pages/dashboard/candidates/new.vue
  • server/api/candidates/extract-cv.post.ts
  • server/utils/ai/cvExtraction.ts
  • tests/unit/cv-extraction.test.ts

Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands.

@railway-app
railway-app Bot temporarily deployed to applirank / reqcore-pr-257 August 4, 2026 19:06 Destroyed
@railway-app

railway-app Bot commented Aug 4, 2026

Copy link
Copy Markdown

🚅 Deployed to the reqcore-pr-257 environment in applirank

Service Status Web Updated (UTC)
applirank ✅ Success (View Logs) Aug 4, 2026 at 7:18 pm

Allows users to create a new candidate from within the application
modal,
including optional CV extraction, rather than being limited to searching
existing candidates.
@railway-app
railway-app Bot temporarily deployed to applirank / reqcore-pr-257 August 4, 2026 19:13 Destroyed
@JoachimLK
JoachimLK merged commit cb5352a into main Aug 4, 2026
10 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant