Skip to content
Agentmart
Submit a tool

resume-optimizer

Build and optimize CVs/resumes with ATS scoring, keyword analysis, PDF/DOCX export, and multiple templates.

Skill by garri333

IndexedMIT★ 1
Write a review

Install

Works with Claude Code, Claude apps, Codex, Cursor, Gemini CLI, GitHub Copilot, VS Code, OpenCode, Goose, Windsurf. Read the repository before you give any tool access to your data.

npx agentmarket install skill/garri333-resume-optimizer

Asks which of your tools to add it to (Claude Code, Codex, Cursor, VS Code, Windsurf, Gemini CLI, Claude Desktop) and shows the change first. See https://agentmart.dev/cli.

Get the weekly diff

The weekly diff: one email a week with new agent tools, notable updates and grade changes, plus security alerts for tools you follow. Double opt-in, one-click unsubscribe.

We use your email only for this newsletter. Privacy

About

Build and optimize CVs/resumes with ATS scoring, keyword analysis, PDF/DOCX export, and multiple templates. Tailor resumes for specific job descriptions automatically.

Use cases: documents, writing

No reviews yet. Installed it? Reviews come from verified installers only. How reviews work

Permissions

What this skill can do and what it asks for, from its SKILL.md. Checked Oct 25, 2026.

Tools
No tools found
Secrets
None asked for
Install scripts
None found

Network hosts it talks to 1

  • codeload.github.com · found in install command

Files it touches

  • ~/.claude/skills/resume-optimizer

What's inside

Skill name
resume-optimizer
Description
Build and optimize CVs/resumes with ATS scoring, keyword analysis, PDF/DOCX export, and multiple templates. Tailor resumes for specific job descriptions automatically.
License
MIT
Instructions
388 lines in SKILL.md · view on GitHub

Files (1)

  • SKILL.md

SKILL.md (first lines)

# Resume Optimizer Skill

## Setup

```bash
pip install python-docx reportlab spacy scikit-learn python-dotenv
python -m spacy download en_core_web_sm
```

## Resume Data Structure

```python
from dataclasses import dataclass, field

@dataclass
class ResumeContact:
    name: str
    email: str
    phone: str
    location: str
    linkedin: str = ""
    github: str = ""
    website: str = ""

@dataclass
class ResumeExperience:
    company: str
    role: str
    start: str        # "Jan 2022"
    end: str          # "Present"
    location: str
    bullets: list[str] = field(default_factory=list)

@dataclass
class ResumeEducation:
    institution: str
    degree: str
    field: str
    start: str
    end: str
    gpa: str = ""
    achievements: list[str] = field(default_factory=list)

@dataclass
class ResumeSkills:
    technical: list[str] = field(default_factory=list)
    languages: list[str] = field(default_factory=list)
    tools: list[str] = field(default_factory=list)
    soft: list[str] = field(default_factory=list)

@dataclass
class Resume:
    contact: ResumeContact
    summary: str
    experience: list[ResumeExperience] = field(default_factory=list)
    education: list[ResumeEducation] = field(default_factory=list)
    skills: ResumeSkills = field(default_factory=ResumeSkills)
    certifications: list[str] = field(default_factory=list)
    projects: list[dict] = field(default_factory=list)
    languages_spoken: list[dict] = field(default_factory=list)  # [{"language": "Spanish", "level": "Native"}]
```

## ATS Keyword Analysis

```python
import re
from collections import Counter
import spacy

nlp = spacy.load("en_core_web_sm")

def extract_keywords(text: str, top_n: int = 30) -> list[str]:
    """Extract important keywords from a job description."""
    doc = nlp(text.lower())
    
    # Filter to nouns, proper nouns, adjectives — skip stopwords
    keywords = [
        token.lemma_ for token in doc
        if not token.is_stop and not token.is_punct and token.pos_ in {"NOUN", "PROPN", "ADJ"}
        and len(token.text) > 2
    ]
    
    counter = Counter(keywords)
    return [word for word, _ in counter.most_common(top_n)]

def ats_score(resume: Resume, job_description: str) -> dict:
    """Calculate ATS compatibility score against a job description."""
    jd_keywords = set(extract_keywords(job_description, top_n=50))
    
    # Build resume text blob
    resume_text = " ".join([
        resume.summary,
        " ".join(resume.skills.technical),
        " ".join(resume.skills.tools),
        " ".join([b for exp in resume.experience for b in exp.bullets]),
    ]).lower()
    
    resume_doc = nlp(resume_text)
    resume_words = {token.lemma_ for token in resume_doc if not token.is_stop}
    
    matched = jd_keywords & resume_words
    missing = jd_keywords - resume_words
    
    score = (len(matched) / len(jd_keywords)) * 100 if jd_keywords else 0
    
    return {
        "score": round(score, 1),
        "matched_keywords": sorted(matched),
        "missing_keywords": sorted(missing),
        "recommendation": "Good ATS match" if score >= 70 else "Add missing keywords to improve ATS score"
    }

def optimize_for_job(resume: Resume, job_description: str) -> dict:
    """Suggest bullet improvements to target a specific JD."""
    score = ats_score(resume, job_description)
    recommendations = []
    
    if score["score"] < 60:
        recommendations.append("⚠️  ATS score < 60%. You may be filtered automatically.")

From garri333/Skills, MIT.

More from garri333/Skills

Signals

Stars
1
Forks
0
Open issues
0
Last commit (this folder)
Feb 18, 2026 (8 months ago)

From GitHub (fetched Oct 24, 2026).

Details

License
MIT
First seen
Oct 24, 2026
Last checked
Oct 24, 2026

More from garri333

Cite this page

resume-optimizer skill. Agent Mart. https://agentmart.dev/skills/garri333-resume-optimizer (last updated 2026-10-24)