From content
Extract and analyze a person's writing voice DNA from their LinkedIn posts. Produces an 8-dimension style profile with posting mode classification, vocabulary fingerprint, signature moves, and a Prompt Engineering Guide for AI-assisted writing in that voice. Use when the user wants to analyze someone's writing style, extract voice DNA, study how someone writes on LinkedIn, or prepare a style profile for content creation. Trigger on "analyze their writing style", "voice DNA", "extract their style", "how does [person] write", "style analysis", "LinkedIn voice", "writing DNA", "study their posts", "process another person", or any request to understand or replicate someone's LinkedIn writing patterns.
How this skill is triggered — by the user, by Claude, or both
Slash command
/content:voice-dnaThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Extract a person's writing voice from their LinkedIn posts. Produce a reusable style profile with an 8-dimension analysis and a Prompt Engineering Guide for AI-assisted writing in that voice.
Extract a person's writing voice from their LinkedIn posts. Produce a reusable style profile with an 8-dimension analysis and a Prompt Engineering Guide for AI-assisted writing in that voice.
projects/blogging/corpus/{handle}/linkedin-posts.md).work/style-research/{handle}-mode-classification.md).work/style-research/)projects/blogging/analyses/{handle}.md)projects/blogging/analyses/blended-voice.md)~/.claude/skills/my-voice/)linkedin skill handles Chrome MCP setup; this skill handles the analysis workflowBefore extracting anything, understand the user's intent. Ask:
If the user already provided answers in their initial request, don't re-ask — incorporate what they said.
Read references/voyager-api.md for the full technical reference.
Summary of the approach:
https://www.linkedin.com/in/{handle}/recent-activity/all/ in Chromeread_network_requests after clicking "Show More"profileUrn, queryId, and CSRF tokenpaginationToken (NOT start parameter)console.log() channel (JS return value gets blocked by content filter)scripts/parse-voyager-corpus.pyCorpus format (one post per section):
## Post {N}
**Date:** YYYY-MM-DD
**Type:** Original/Repost
**Engagement:** {likes} likes, {comments} comments
**URL:** {url}
{full post text}
---
Save to: projects/blogging/corpus/{handle}/linkedin-posts.md
Update .work/style-research/scratchpad.md with extraction stats (post count, date range, originals vs reposts).
If Voyager API fails (can't capture endpoint, auth issues), fall back to DOM scraping — see the fallback section in references/voyager-api.md. DOM scraping works better on the user's own profile than on external profiles.
Spawn 1 subagent to classify all posts. The agent needs:
references/dimensions.md (contains posting mode definitions and classification procedure)Agent prompt template:
You are classifying LinkedIn posts into posting modes for a voice DNA analysis.
Read these files:
1. {corpus_path} — the full post corpus
2. {skill_path}/references/dimensions.md — Part 1 has the 6 posting modes and classification procedure
For each post, assign exactly one mode: authentic_voice, quick_reshare, marketing_provided, event_promo, thought_piece, or minimal_legacy.
Focus on the most recent 500 posts if the corpus is larger. For older posts, do temporal sampling (every 5th post) to confirm distribution holds.
Output format — save to {output_path}:
1. Summary table (mode, count, percentage)
2. Per-post classification: Post number, mode, confidence (high/medium/low), brief rationale for non-obvious classifications
3. Key observations about corpus composition
Subject-specific notes: {any context from the interview about this person's role, platform, likely mode distribution}
After classification completes: Present the summary table to the user for sanity-check before proceeding. Let them flag any misclassifications or patterns you missed.
After user approves mode classification, spawn 2 parallel subagents:
Agent A — Dimensions 1-4 (Voice, Language, Humor, Thought Leadership):
You are analyzing the writing style of {name} across 4 dimensions.
Read these files:
1. {corpus_path} — full corpus
2. {mode_classification_path} — use ONLY authentic_voice and thought_piece posts
3. {skill_path}/references/dimensions.md — Part 2, dimensions 1-4
For each dimension:
- Position the author on every spectrum (percentage + characterization)
- Cite specific evidence (post numbers + verbatim quotes)
- Flag any anti-patterns detected
- Note temporal evolution if patterns shift across years
Special attention to: {aspects the user highlighted in interview}
Context: {person's role, native language, audience — affects language register analysis}
Save to: {output_path}
Agent B — Dimensions 5-8 (Authenticity, Structure, Persuasion, Topic Framing):
You are analyzing the writing style of {name} across 4 dimensions.
Read these files:
1. {corpus_path} — full corpus
2. {mode_classification_path} — use ONLY authentic_voice and thought_piece posts
3. {skill_path}/references/dimensions.md — Part 2, dimensions 5-8
For each dimension:
- Analyze with specific evidence (post numbers + verbatim quotes)
- Identify signature structural patterns and recurring techniques
- Note temporal evolution if patterns shift across years
- Catalog hook patterns with frequencies
Special attention to: {aspects the user highlighted in interview}
Context: {person's role, audience — affects persuasion and framing analysis}
Save to: {output_path}
After both analysis agents complete, synthesize into the final profile. Read references/output-template.md for the full template.
Either do this in the main thread (if context allows) or spawn a synthesis agent that reads:
references/output-template.md (the template to follow)The synthesis must produce ALL sections in the template, including the full Prompt Engineering Guide with:
Save to: projects/blogging/analyses/{handle}.md
Before presenting to the user, verify:
Present to the user: a brief summary of key findings, the voice essence in 1-2 sentences, and the most surprising discovery. Point them to the full profile path.
When the user has 2+ completed profiles and wants to synthesize a blended voice for their own content creation. This phase reads the individual profiles' Prompt Engineering Guides + Blending Notes and produces a unified voice.
When to trigger: User says "blend voices", "combine profiles", "create my voice", "synthesize voice", "mix these voices", or has completed multiple profiles and wants to create content in a blended style. Also triggers when the user asks to "write a LinkedIn post" and has analyzed multiple voices but no my-voice skill exists yet.
If not already clear from context, ask:
projects/blogging/analyses/. Confirm which ones to include.For each profile, load these sections:
The blending notes in each influence profile already contain: non-negotiable elements, blendable elements, audience translation table, and what NOT to blend. These are the primary inputs.
Spawn a synthesis agent that reads all source profiles + references/blending-template.md and produces:
projects/blogging/analyses/blended-voice.md — follows the blending template~/.claude/skills/my-voice/SKILL.md — auto-generated skill containing the blended voice DNA, ready to trigger on LinkedIn/blog content creation~/.claude/skills/my-voice/references/calibration-posts.md — 5-7 gold standard posts (full text) from across all source corporaThe blended voice must read as one coherent person, not a patchwork. The base voice's identity (L1 markers, core positioning, audience relationship) is non-negotiable. Influence voices contribute techniques, patterns, and range — not identity.
Agent prompt template:
You are synthesizing a blended writing voice from multiple analyzed profiles.
Read these files:
1. {profile_paths} — all source profiles (focus on: Summary, Signature Moves, Key Takeaways, Prompt Engineering Guide sections)
2. {skill_path}/references/blending-template.md — the template for the blended output
3. {corpus_paths} — source corpora (for selecting calibration posts with full text)
Interview context:
- Base voice: {base_name} at {base_pct}%
- Influences: {influence_name} at {pct}%, {influence_name} at {pct}%
- Target: {channels} for {audience}
- Emphasis: {techniques to emphasize}
- Suppress: {techniques to suppress}
Produce THREE files:
1. Blended voice profile → save to {blended_profile_path}
Follow the blending template exactly. The Voice DNA block must be a single coherent prompt, not three blocks merged.
2. my-voice skill SKILL.md → save to {skill_path}
Frontmatter: name "my-voice", description triggering on LinkedIn/blog content.
Body: Voice DNA block, Blend Origins table, Banned/Encouraged patterns, Content Type Templates, Writing Workflow, Self-Test Checklist, source profile pointers.
3. Calibration posts → save to {calibration_path}
5-7 posts from across source corpora. Include full post text. Choose posts that best represent the TARGET blended voice (not the most extreme examples of each individual voice).
Verify:
Present to the user: the blended Voice DNA block, the dial settings table, and the self-test checklist. Point them to both files (blended profile + skill).
| File | Path |
|---|---|
| Corpus | projects/blogging/corpus/{handle}/linkedin-posts.md |
| Mode classification | .work/style-research/{handle}-mode-classification.md |
| Dims 1-4 analysis | .work/style-research/{handle}-analysis-voice-language.md |
| Dims 5-8 analysis | .work/style-research/{handle}-analysis-structure-persuasion.md |
| Final profile | projects/blogging/analyses/{handle}.md |
| Progress tracking | .work/style-research/scratchpad.md (append) |
| Blended voice profile | projects/blogging/analyses/blended-voice.md |
| my-voice skill | ~/.claude/skills/my-voice/SKILL.md |
| Calibration posts | A user-maintained calibration-posts.md (e.g. in a local my-voice/ skill or project notes) |
| Blending template | references/blending-template.md (this skill's reference) |
{handle} = LinkedIn username slug. Derive from the profile URL.
If you have prior analyses on disk (e.g. in projects/blogging/analyses/<handle>.md), agents can read them to calibrate output depth and format. The expected shape is one markdown file per analyzed profile, named by handle, containing the 8-dimension style profile this skill produces.
Voyager API returns same page repeatedly: You're using start for pagination instead of paginationToken. See references/voyager-api.md.
Timestamps 40 years in future: You added Twitter epoch offset. LinkedIn snowflakes use Unix epoch directly. See references/voyager-api.md.
JS return value blocked: Use console.log() + read_console_messages channel. Content filter blocks combined social media text in return values.
DOM shows only ~5 posts for external profile: Expected — DOM virtualization. Switch to Voyager API method.
Corpus too large for a single console.log: Output in chunks, read all at once, parse with scripts/parse-voyager-corpus.py.
npx claudepluginhub kzarzycki/agent-skills --plugin contentCreates, edits, and optimizes skills for Claude Code, including drafting, evaluating with test prompts, iterating on performance, and improving skill descriptions for better triggering accuracy.