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...
Scanned 5/27/2026
Install via CLI
openskills install joshua-burnell-1/linkedin-profile-rewriter---
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.
No comments yet. Be the first to comment!