Skip to content

Latest commit

 

History

History
699 lines (500 loc) · 26.9 KB

File metadata and controls

699 lines (500 loc) · 26.9 KB

**Resume Shapeshifter** is a JD-to-resume tailoring engine. A user provides a job description and an existing resume, and the system generates a tailored version of the resume that better aligns with the job listing while preserving truthfulness and the user's actual experience.

The product should rewrite resume bullets, score the resume-to-JD match, flag missing skills or experience gaps, and generate a side-by-side PDF comparing the original resume with the tailored resume for a real job listing.

The goal is not to fabricate experience. The system should help users express their existing experience in language that better matches a target role.


Job seekers often apply to many roles that require slightly different phrasing, skills, and emphasis. Tailoring a resume manually for each job description is time-consuming, inconsistent, and difficult to evaluate objectively.

Existing resume tools often provide generic suggestions, but they do not clearly show:

Resume Shapeshifter solves this by ingesting a resume and job description, then producing a targeted resume rewrite with scoring, gap analysis, and a side-by-side proof artifact.



Given a resume and a job description, the product should answer:

  1. How well does this resume match the job?
  2. What should be changed to improve the match?
  3. Which bullets can be rewritten truthfully?
  4. What gaps remain after tailoring?
  5. What does the original vs tailored resume look like side by side?

The MVP should support the following workflow:

  1. User uploads or pastes an existing resume.
  2. User pastes a job description or URL text for a real job listing.
  3. System parses both documents.
  4. System extracts relevant skills, responsibilities, keywords, seniority signals, and role requirements from the JD.
  5. System evaluates the current resume against the JD.
  6. System rewrites resume bullets to better align with the JD.
  7. System flags skills or requirements that are missing or weakly represented.
  8. System generates a match score before and after tailoring.
  9. System produces a side-by-side comparison: original resume vs tailored resume.
  10. System exports the result as a PDF.

The MVP should not attempt to:


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.

Optional later enhancement:

The system should extract:

Generate an explainable match score from 0 to 100.

The score should consider:

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:

Each rewritten bullet should include metadata:

The system should flag:

Each gap should include:

Example suggested actions:

The product must explicitly avoid fabrication.

The system should not add:

When uncertain, the system should mark content as a suggestion requiring user confirmation.

The MVP should generate a PDF showing:

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.

User exports:


The parser should convert uploaded or pasted resume content into structured JSON.

Suggested structure:

{
  "contact": {},
  "summary": "",
  "skills": [],
  "experience": [
    {
      "company": "",
      "title": "",
      "startDate": "",
      "endDate": "",
      "bullets": []
    }
  ],
  "projects": [],
  "education": [],
  "certifications": []
}

The parser should convert the job description into structured JSON.

Suggested structure:

{
  "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": ""
        }
      ]
    }
  ]
}

The gap engine should output:

{
  "gaps": [
    {
      "name": "",
      "importance": "high | medium | low",
      "jdEvidence": "",
      "resumeEvidence": "",
      "suggestedAction": "",
      "canSafelyAdd": false
    }
  ]
}

The PDF generator should create two documents:

  1. Tailored resume PDF.
  2. Side-by-side comparison PDF.

The comparison PDF should include:


Recommended options:

Core screens:

Recommended options:

Core services:

For MVP, local/session-based storage is acceptable.

Optional persistent storage:

Suggested entities:


The system should use separate prompts for:

  1. JD extraction.
  2. Resume parsing cleanup.
  3. Resume-JD scoring.
  4. Bullet rewriting.
  5. Gap analysis.
  6. Final resume assembly.

Each LLM output should be requested as strict JSON where possible.

The LLM must be instructed to:


The project is complete when a user can:

  1. Paste a resume.
  2. Paste a real job description.
  3. Click an analyze button.
  4. See the original resume match score.
  5. See extracted JD requirements.
  6. See missing or weakly represented requirements.
  7. Generate a tailored resume.
  8. Review original vs tailored bullets side by side.
  9. See a tailored match score.
  10. 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.

The demo should produce:

The proof artifact should clearly show that Resume Shapeshifter improves resume alignment without fabricating experience.


The generated tailored resume should be:

The gap analysis should be actionable and honest.

The scoring should be explainable rather than opaque.



A practical Cursor-friendly stack:



When implementing this project, prioritize a working vertical slice over broad feature coverage.

Start with:

  1. A single-page app where the user pastes resume text and JD text.
  2. A server route that calls the LLM and returns structured JSON.
  3. A scoring section.
  4. A rewritten bullets section.
  5. A gap analysis section.
  6. A side-by-side preview.
  7. 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

The project is done when the app can generate a complete side-by-side PDF for a real job listing, including:

The output should be polished enough to share as a portfolio project or demo.


Resume Shapeshifter turns any job description into a truthful, targeted resume rewrite with match scoring, gap analysis, and a side-by-side PDF proof artifact.