Existing resume tools often provide generic suggestions, but they do not clearly show:
- How well the resume matches a specific job description.
- Which resume bullets should be rewritten.
- Which keywords, skills, or responsibilities are missing.
- Whether the tailored resume remains truthful to the original resume.
- A clean before-and-after comparison that can be reviewed and exported.
- Job seekers applying to multiple roles.
- Students and early-career professionals tailoring resumes for internships or entry-level jobs.
- Mid-career professionals applying to role-specific openings.
Given a resume and a job description, the product should answer:
- How well does this resume match the job?
- What should be changed to improve the match?
- Which bullets can be rewritten truthfully?
- What gaps remain after tailoring?
- What does the original vs tailored resume look like side by side?
The MVP should support the following workflow:
- User uploads or pastes an existing resume.
- User pastes a job description or URL text for a real job listing.
- System parses both documents.
- System extracts relevant skills, responsibilities, keywords, seniority signals, and role requirements from the JD.
- System evaluates the current resume against the JD.
- System rewrites resume bullets to better align with the JD.
- System flags skills or requirements that are missing or weakly represented.
- System generates a match score before and after tailoring.
- System produces a side-by-side comparison: original resume vs tailored resume.
- System exports the result as a PDF.
The MVP should not attempt to:
- Apply to jobs automatically.
- Scrape job boards at scale.
- Fabricate work history, education, certifications, or metrics.
- Guarantee ATS ranking outcomes.
- Replace professional career advice.
- Support complex multi-column resume designs perfectly in version one.
- Create cover letters unless added later as an extension.
Support at least one of the following in MVP:
The parsed resume should preserve logical sections such as:
Support pasted job description text in MVP.
- Job title.
- Company name, if present.
- Required skills.
- Preferred skills.
- Tools, technologies, and platforms.
- Responsibilities.
- Qualifications.
- Seniority level.
- Domain-specific keywords.
- Soft skills or behavioral signals.
Generate an explainable match score from 0 to 100.
- Required skill coverage.
- Preferred skill coverage.
- Relevant experience alignment.
- Keyword alignment.
- Responsibility alignment.
- Seniority alignment.
- Missing critical requirements.
The UI or output should include both:
The score should be accompanied by a short explanation, not just a number.
For each relevant resume bullet, the engine should:
- Preserve the user's actual meaning and experience.
- Improve alignment with the JD.
- Use stronger action verbs.
- Include JD-relevant terminology where truthful.
- Preserve or improve measurable impact when present.
- Avoid adding unsupported claims.
Each rewritten bullet should include metadata:
- Original bullet.
- Tailored bullet.
- Reason for change.
- JD keywords addressed.
- Confidence level.
- Risk flag if the rewrite may overstate experience.
- Missing required skills.
- Weakly represented required skills.
- Missing tools or technologies.
- Missing domain experience.
- Missing seniority indicators.
- Unsupported JD requirements that should not be invented.
- Gap name.
- Importance: high, medium, or low.
- Evidence from the JD.
- Whether the resume mentions it.
- Suggested action.
- Add if you have this experience.
- Leave out if not true.
- Mention in skills section if familiar.
- Add a project bullet if applicable.
- Prepare to address this in interview.
The product must explicitly avoid fabrication.
- Employers the user did not work for.
- Degrees or certifications the user does not have.
- Technologies not present in the resume unless marked as a suggested gap.
- Metrics that were not provided.
- Leadership scope that was not implied by the original resume.
- Claims of expert-level proficiency without support.
When uncertain, the system should mark content as a suggestion requiring user confirmation.
The MVP should generate a PDF showing:
- Left side: original resume content.
- Right side: tailored resume content.
- Highlighted changed bullets.
- Match score before and after.
- Gap analysis summary.
- JD summary.
This PDF is the main proof artifact for the project.
User uploads or pastes their resume.
User pastes a real job listing.
System parses both inputs and shows:
System rewrites relevant bullets and optionally adjusts:
User sees side-by-side comparison of original and tailored content.
Each rewritten bullet should have a clear explanation.
The parser should convert uploaded or pasted resume content into structured JSON.
{
"contact": {},
"summary": "",
"skills": [],
"experience": [
{
"company": "",
"title": "",
"startDate": "",
"endDate": "",
"bullets": []
}
],
"projects": [],
"education": [],
"certifications": []
}The parser should convert the job description into structured JSON.
{
"jobTitle": "",
"company": "",
"requiredSkills": [],
"preferredSkills": [],
"responsibilities": [],
"qualifications": [],
"tools": [],
"keywords": [],
"seniorityLevel": "",
"domainSignals": []
}The match engine should output:
{
"overallScore": 0,
"skillCoverageScore": 0,
"responsibilityAlignmentScore": 0,
"keywordScore": 0,
"seniorityScore": 0,
"criticalMissingRequirements": [],
"explanation": ""
}The tailoring engine should output:
{
"tailoredSummary": "",
"tailoredSkills": [],
"tailoredExperience": [
{
"company": "",
"title": "",
"bullets": [
{
"original": "",
"tailored": "",
"changeReason": "",
"keywordsAddressed": [],
"confidence": "high | medium | low",
"riskFlag": ""
}
]
}
]
}{
"gaps": [
{
"name": "",
"importance": "high | medium | low",
"jdEvidence": "",
"resumeEvidence": "",
"suggestedAction": "",
"canSafelyAdd": false
}
]
}The PDF generator should create two documents:
The comparison PDF should include:
- Header with job title and company.
- Original score vs tailored score.
- JD requirements summary.
- Original bullet column.
- Tailored bullet column.
- Highlighted differences.
- Gap analysis section.
- Disclaimer that the user must verify all content before use.
- Node.js API routes in Next.js.
- Python FastAPI service if document parsing and PDF generation are easier in Python.
- Resume parsing service.
- JD parsing service.
- Scoring service.
- LLM tailoring service.
- Gap analysis service.
- PDF generation service.
For MVP, local/session-based storage is acceptable.
The system should use separate prompts for:
- JD extraction.
- Resume parsing cleanup.
- Resume-JD scoring.
- Bullet rewriting.
- Gap analysis.
- Final resume assembly.
Each LLM output should be requested as strict JSON where possible.
The LLM must be instructed to:
- Never invent experience.
- Use only evidence from the resume.
- Mark uncertain suggestions clearly.
- Keep bullet length resume-appropriate.
- Prefer concrete impact and measurable outcomes.
- Avoid keyword stuffing.
- Preserve the user's original career level.
- Explain every meaningful rewrite.
The project is complete when a user can:
- Paste a resume.
- Paste a real job description.
- Click an analyze button.
- See the original resume match score.
- See extracted JD requirements.
- See missing or weakly represented requirements.
- Generate a tailored resume.
- Review original vs tailored bullets side by side.
- See a tailored match score.
- Export a side-by-side PDF showing original vs tailored resume.
The final demo should use a real job listing and a real or realistic sample resume.
- Original resume text.
- Job description text.
- JD analysis.
- Original match score.
- Tailored resume.
- Tailored match score.
- Gap analysis.
- Side-by-side PDF comparison.
The generated tailored resume should be:
- Truthful.
- Concise.
- ATS-friendly.
- Specific to the job description.
- Easy to review.
- Exportable.
- Clearly different from the original where relevant.
- Not overloaded with unnatural keywords.
The gap analysis should be actionable and honest.
The scoring should be explainable rather than opaque.
- Build UI for resume and JD input.
- Use pasted text only.
- Mock parsing and scoring.
- Render side-by-side comparison in browser.
- Add JD extraction prompt.
- Add resume parsing prompt.
- Add scoring prompt.
- Add bullet rewrite prompt.
- Add gap analysis prompt.
- Add unsupported-claim detection.
- Add confidence labels.
- Add user confirmation flags.
- Add stricter JSON schema validation.
A practical Cursor-friendly stack:
- **Frontend:** Next.js, React, TypeScript, Tailwind CSS, Shadcn UI
- **Backend:** Next.js API routes or FastAPI
- **LLM:** OpenAI API or another structured-output-capable LLM
- **Validation:** Zod
- **PDF Generation:** Playwright PDF, React PDF, or Puppeteer
- **Document Parsing:** pdf-parse, mammoth, or Python alternatives
- **Storage:** SQLite, Supabase, or local JSON for MVP
- Multi-column resumes may parse poorly.
- PDF formatting may produce broken text order.
- Resume sections may have non-standard names.
- The model may overstate experience.
- The model may add unsupported keywords.
- The model may produce inconsistent JSON.
- The score may appear more precise than it really is.
- Users may trust generated content without reviewing it.
- Users may expect guaranteed ATS performance.
- Job descriptions may be vague or overly broad.
- Add strong truthfulness instructions.
- Validate JSON responses.
- Show evidence for each rewrite.
- Include disclaimers.
- Require user review before export.
- Flag low-confidence changes.
When implementing this project, prioritize a working vertical slice over broad feature coverage.
- A single-page app where the user pastes resume text and JD text.
- A server route that calls the LLM and returns structured JSON.
- A scoring section.
- A rewritten bullets section.
- A gap analysis section.
- A side-by-side preview.
- A PDF export button.
Use TypeScript types or Zod schemas for every major object:
Keep prompts in separate files, for example:
/prompts/jd-extraction.ts
/prompts/resume-parser.ts
/prompts/match-scoring.ts
/prompts/bullet-rewriter.ts
/prompts/gap-analysis.ts
Keep rendering components separate from business logic:
/components/ResumeInput.tsx
/components/JDInput.tsx
/components/ScoreCard.tsx
/components/GapAnalysis.tsx
/components/SideBySideDiff.tsx
/components/PDFExportButton.tsx
/lib/scoring.ts
/lib/prompts.ts
/lib/pdf.ts
/lib/schemas.ts
- Original resume.
- Tailored resume.
- Original match score.
- Tailored match score.
- JD keyword and requirement summary.
- Bullet-level rewrite explanations.
- Gap analysis.
- Truthfulness disclaimer.
The output should be polished enough to share as a portfolio project or demo.