Skip to content

[Feature Request]: Add Resume Parsing Integration to Email Generator — Upload PDF Resume to Personalize Cold Outreach #170

Description

@divyanshim27

Summary

The Arachnode roadmap lists resume parsing as a planned and partially built feature (resume_parser.py exists in email-generator-service/). However, the dashboard UI has no interface for uploading a resume, and the gateway's /api/generate endpoint does not appear to expose resume context as a first-class parameter for email personalization. The infrastructure exists — it just needs to be wired up end-to-end.

Problem

  • email-generator-service/resume_parser.py and RESUME_PARSER_EXAMPLES.md confirm parsing logic exists, but there is no upload interface in dashboard.html.
  • The /api/generate endpoint accepts candidate_skills, candidate_role, and candidate_experience as optional body parameters, but these must be typed manually — there is no mechanism to auto-populate them from a parsed resume.
  • Cold emails generated without resume context are generic and less likely to receive responses — the core value proposition of the email generator is undermined.
  • The roadmap explicitly calls this out: "Add resume parsing module adapting outbound email drafting according to distinct required keywords mapped off CV text profiles." — this is a maintainer-endorsed feature.

Impact

  • Without resume integration, every generated email requires manual skill/experience input, which defeats the automation purpose.
  • Outreach quality is directly proportional to how well the email reflects the candidate's actual background.
  • The existing resume_parser.py code goes largely unused in the actual user flow.

Proposed Solution

1. Add resume upload form to dashboard.html:

<div id="resume-upload-panel" class="panel">
  <h3>Upload Resume</h3>
  <input type="file" id="resume-file" accept=".pdf,.txt" />
  <button id="parse-resume-btn">Parse & Save</button>
  <div id="parsed-resume-preview"></div>
</div>

2. Add /api/resume/parse endpoint in the gateway:

@app.post("/api/resume/parse")
async def parse_resume(file: UploadFile = File(...)):
    content = await file.read()
    parsed = resume_parser.parse(content, file.content_type)
    # Store parsed context in session or DB for use by /api/generate
    return {"skills": parsed.skills, "experience": parsed.experience, "role": parsed.target_role}

3. Auto-populate /api/generate from stored resume context:

// In dashboard.html JS
async function generateWithResume(jobId, contactId) {
  const resumeCtx = JSON.parse(sessionStorage.getItem('parsed_resume') || '{}');
  const response = await fetch('/api/generate', {
    method: 'POST',
    headers: { 'Content-Type': 'application/json' },
    body: JSON.stringify({
      job_id: jobId,
      contact_id: contactId,
      template: 'cold_outreach',
      candidate_skills: resumeCtx.skills,
      candidate_role: resumeCtx.role,
      candidate_experience: resumeCtx.experience
    })
  });
}

Additional Notes

  • I will update the email-generator-service to accept resume context from the gateway rather than requiring it to be embedded in each request.
  • The parsed resume will be stored in sessionStorage on the frontend for the current browser session.
  • I will add a "Resume Loaded" indicator in the dashboard showing which resume is currently active.

I'd love to be assigned this issue and implement it completely.

Labels: enhancement, feature, roadmap, help wanted, GSSoC 2026

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions