Resume Fit Lab
Score a resume against a job description with match score, missing skills, strengths, and rewritten bullets.
Run this experiment yourself
Demos are not embedded on this site. Deploy a standalone copy on Vercel or run the experiment app locally.
Local development
cd apps/experiments/resume-fit-lab pnpm install pnpm dev
Then open http://localhost:3010.
This is an experimental demo. Use it as a starting point for your own projects.
Resume Fit Lab compares a job description and resume (both textareas) and returns a structured fit report: matchScore (0–100), missingSkills[], strengths[], and rewrittenBullets[]. Helpers in logic.ts clamp the score and list lengths after generateObject. No keys - 503.
Features
- Dual text inputs – job description + resume (each capped ~10k chars).
- Structured fit report – score, gaps, strengths, rewritten bullets.
- Normalized output –
normalizeFitResultclamps score and array sizes. - Sample JD / resume – one-click reset content.
- Honest degradation – never invents a fit score without a provider.
Server Reference
POST /api/fit
{ "jobDescription": "...", "resume": "..." }Success (200)
{
"matchScore": 78,
"missingSkills": ["Postgres"],
"strengths": ["Next.js", "TypeScript"],
"rewrittenBullets": ["Deployed Next.js apps on Vercel with typed APIs."],
"provider": "ai-gateway"
}| Status | Cause |
|---|---|
503 | No AI provider |
400 | Missing either field |
Implementation Details
Validate and truncate
Both fields required; truncateText enforces MAX_FIELD_CHARS.
generateObject + normalize
const result = await generateObject({ model: resolveModel(), schema: fitSchema, prompt });
return Response.json({ ...normalizeFitResult(result.object), provider: providerLabel() });Use Cases
- Coaching rewrite suggestions for applicants.
- Teaching structured HR-adjacent AI outputs (with clear disclaimer).
- Quick gap analysis before a real ATS pipeline.
Limitations
- Educational only - not a hiring decision tool.
- No file upload parsing beyond pasted text in this lab.
- No auth / rate limits.
- Score is model-subjective.
Use in your project
Reuse the Zod fitSchema and normalizeFitResult. Add your own auth before exposing publicly.
Deployment
Local Development
cd apps/experiments/resume-fit-lab
pnpm install
pnpm devConfiguration
| Variable | Required | Purpose |
|---|---|---|
AI_GATEWAY_API_KEY | Yes (or OPENAI_API_KEY) | Preferred provider |
OPENAI_API_KEY | No | Fallback |
AI_MODEL | No | Model override |
Vercel / Next.js Features Used
- AI SDK
generateObject - Vercel AI Gateway
- Route Handlers
- Zod