Skip to content
Back to skills

Skill

ASecurity

Use when the user wants to rewrite, optimize, refresh, or "make less generic" their LinkedIn profile for a specific target role. Triggers on phrases like "rewrite my LinkedIn", "make my profile stand out", "how does my LinkedIn compare to others in [field]", or pasting a resume + job description and asking for profile copy. Rewrites Headline, About, Experience, Skills, and Featured sections. Benchmarks against real competitor profiles via web search and user-pasted samples, then iterates agai...

  • 2 stars
  • 0 votes
  • 0 copies
  • 0 views
  • Added May 26, 2026
ai-agentsgorailsapi

Works with

  • api

Security analysis

A100/100

Pro scans all 17 files and shows the line behind each finding

Scanned May 27, 2026

npx -y skills add joshua-burnell-1/linkedin-profile-rewriter --skill skill --agent claude-code

Installs into .claude/skills of the current project.

Are you the author of Skill?

Add the live security badge to your README. It updates with every re-scan.

Security grade badge for Skill
[![Security: A — Skills Directory](https://www.skillsdirectory.com/api/skills/joshua-burnell-1-skill/badge)](https://www.skillsdirectory.com/skills/joshua-burnell-1-skill)

More formats (shields.io, HTML) on the badges page. Keep it an A: scan every change in CI with Pro.

Download with Pro
SKILL.md
---
name: linkedin-profile-rewriter
description: Use when the user wants to rewrite, optimize, refresh, or "make less generic" their LinkedIn profile for a specific target role. Triggers on phrases like "rewrite my LinkedIn", "make my profile stand out", "how does my LinkedIn compare to others in [field]", or pasting a resume + job description and asking for profile copy. Rewrites Headline, About, Experience, Skills, and Featured sections. Benchmarks against real competitor profiles via web search and user-pasted samples, then iterates against a five-dimension rubric (Clarity, Specificity, Anti-buzzword, Story arc, Keyword match) until reaching the quality bar (total ≥90 with no dimension below 15) without sanding off the user's voice. Do NOT use for resume tailoring (use resume-tailor) or for cover letters.
---

<!-- ABOUTME: Entry point for the linkedin-profile-rewriter skill. -->
<!-- ABOUTME: Orchestrates a 6-phase flow from resume + JD to a scored, refined LinkedIn profile. -->

# linkedin-profile-rewriter

## When to use this skill

Trigger on natural-language requests like:
- "Can you rewrite my LinkedIn for this role?"
- "Make my profile less generic."
- "How does my LinkedIn compare to others in [field]?"
- "Here's my resume and a JD, fix my profile."
- "Help me stand out for [target role]."

## When NOT to use

- Resume rewrites or tailoring → use `resume-tailor`
- Cover letters → use `resume-tailor`
- General career advice with no target role
- Posting to LinkedIn directly (out of scope; ToS risk)

## Required inputs

Before starting Phase 1, confirm you have all three:

1. **Resume** — `.pdf`, `.docx`, or `.md`. Source of truth for facts.
2. **Target job description(s)** — 1-3 JDs as text, URL, or file. Multiple JDs are merged into a target-role profile.
3. **Tone sample** — 50-500 words of the user's own writing (past About section, blog post, Slack message, etc.). Anchors voice.

Optional:
- **Current LinkedIn profile** — markdown export or pasted sections. If provided, the skill diffs old vs. new in `analysis.md`.

If any required input is missing, ask for it before proceeding. Do not guess or proceed without all three.

## Workflow

### Phase 1: Intake and normalization
- Parse resume into structured sections (roles, dates, accomplishments, skills).
- Extract from JD(s): role title, seniority, required/preferred skills, domain language, mission statements.
- Extract from tone sample: sentence length, formality, "I" vs "we", stories vs. claims, hedge words, signature phrases.

### Phase 1.5: Resume strength gate (BLOCKING)
- Count concrete claims in the resume (number, named system, named customer, or named outcome) vs. abstract claims.
- If concrete-claim density is **<30%**, halt. Surface to the user with three options:
  - (a) Add 5-10 concrete accomplishments per role and re-run.
  - (b) Proceed knowing the rubric ceiling will be roughly 70/100.
  - (c) Defer (guided extraction interview is v1.1).
- If density is **≥30%**, proceed.
- This gate is non-optional. Skipping it produces low-ceiling output silently.

### Phase 2: Profile discovery (user-driven, web-search-assisted)
- Ask the user to paste the **full text of 2-3 profiles** from people in or near the target role whom they admire. This is the primary benchmark input.
- Optionally run `web_search` as an aid using patterns from `reference/search-patterns.md`. Return a discovery list of 5-8 candidates with one-line rationale each. The user picks which (if any) to paste in full.
- This is a **discovery list, not a competitive set**. Be honest with the user about what the snippets show and don't show.

### Phase 3: Pattern analysis
- Analyze pasted profiles for: opening hook patterns, story arc structure, specificity vs. abstraction ratio, signature phrases, scope/scale framing, what they leave out.
- Produce a "best-of-breed pattern brief" using `templates/pattern-brief.md`.
- **Checkpoint:** show the brief to the user and get approval before any rewriting.

### Phase 4: Rewrite
- Rewrite each section using: resume facts + JD targeting + tone signals + pattern brief + style guardrails.
- Sections and limits (see `reference/linkedin-limits.md`):
  - Headline: 220 chars
  - About: 2,600 chars
  - Experience: 2,000 chars per role
  - Skills: top 50, ordered by JD relevance
  - Featured: suggested pinned items with rationale
- Apply style guardrails from `reference/style-guardrails.md`. Defaults: no em-dashes, banned phrase list, first-person preferred, specificity rule (every claim has a number, a named system/customer/outcome, or gets cut).

### Phase 5: Score and refine loop
- Score against the five-dimension rubric (each 0-20, total 100). Use `scripts/score_profile.py` for deterministic dimensions (Anti-buzzword, Keyword match) and LLM grading for the rest. Full rubric in `reference/rubric.md`.
- Show subscores, not just the total.
- If below the quality bar, identify the lowest-scoring dimension(s), propose targeted edits, and re-score.
- **Exit when ANY one of these is true:**
  1. Quality bar reached: total ≥90 AND no individual dimension <15.
  2. Plateau: three consecutive iterations with <2 total points of improvement.
  3. Voice drift: voice similarity to the tone sample drops more than 20% from iteration 1 (halt and surface).
  4. User says stop.
- On exit, the **highest-scoring** version is what gets exported.
- Each iteration: show previous score, new score, what changed, why.

### Phase 6: Deliverables
Produce three artifacts:
- **`profile.md`** — All rewritten sections in markdown, ready to copy-paste into LinkedIn fields.
- **`analysis.md`** — Pattern brief, rubric breakdown per iteration, JD keyword coverage, diff vs. previous profile (if provided), and URLs of competitor profiles that informed the rewrite.
- **`profile.docx`** — Word doc of the final profile (use the `docx` skill, not custom code).

Optional interactive mode: walk through one section at a time in chat, get user approval per section, then export.

## Style guardrails (defaults — user can override per run)

- No em-dashes (Josh's standing preference; user may override).
- Banned phrases: "results-driven", "synergy", "passionate about", "thought leader", "ninja/rockstar/guru", "leverage" as a verb, "best-in-class", "world-class", "game-changer", "move the needle", "at the end of the day". Full list and override syntax in `reference/style-guardrails.md`.
- First-person preferred over third-person.
- Specificity rule: every claim has a number, a named system/customer/outcome, or gets cut.

## Constraints (non-negotiable)

- **No LinkedIn scraping.** Public web search results only. Deep analysis requires user-pasted text.
- **No fabricated experience.** Never invent accomplishments, dates, employers, or scope. Surface gaps to the user; let them decide framing.
- **Sensitive info check.** If the resume contains compensation, internal codenames, or other sensitive data, flag it and ask before including.
- **Disclose sources.** `analysis.md` lists URLs of competitor profiles that informed the rewrite (URLs only, no stored copies).

## Reference docs (load on demand)

- `reference/rubric.md` — Full scoring rubric with examples per dimension.
- `reference/style-guardrails.md` — Default banned phrases, override syntax.
- `reference/search-patterns.md` — Web search query templates for profile discovery.
- `reference/linkedin-limits.md` — Section character limits and formatting rules.

## Templates

- `templates/pattern-brief.md` — Competitor pattern brief structure.
- `templates/analysis-report.md` — `analysis.md` output template.
- `templates/profile-skeleton.md` — `profile.md` output template.

## Scripts

- `scripts/score_profile.py` — Deterministic scorer for Anti-buzzword and Keyword match dimensions. Run before LLM grading to get fast, reproducible subscores.
- `scripts/export_docx.py` — Markdown to `.docx`. Prefer the `docx` skill if available; this script is a fallback.

Files in this skill

  • SKILL.md7.8 KB
  • examples/example-input/jd.md2.5 KB
  • examples/example-input/resume.md3.1 KB
  • examples/example-input/tone-sample.md1.3 KB
  • examples/example-output/analysis.md4.7 KB
  • examples/example-output/profile.md6 KB
  • reference/linkedin-limits.md3.3 KB
  • reference/rubric.md8 KB
  • reference/search-patterns.md3.1 KB
  • reference/style-guardrails.md3 KB
  • scripts/export_docx.py2.6 KB
  • scripts/score_profile.py5.8 KB
  • templates/analysis-report.md2.5 KB
  • templates/pattern-brief.md2.4 KB
  • templates/profile-skeleton.md2.3 KB
  • tests/e2e.test.md3.6 KB
  • tests/triggers.test.md2.7 KB

Attribution

Is this your skill, or is something wrong with this listing? Request removal or report an issue. Author removals are honored within 72 hours.

Comments

Loading comments…

Newsletter

Get the weekly list of safe new skills, and the ones we pulled.