
Voice Extract
- 74 installs
- 325 repo stars
- Updated August 2, 2026
- athola/claude-night-market
Voice-extract is the register-creation module in the Claude Night Market voice stack.
About
Voice-extract is the register-creation module in the Claude Night Market voice stack. After an extraction pass analyzes a founder’s writing samples, this skill tells the agent how to materialize durable markdown registers—starting with a default profile that captures vocabulary directives, sentence rhythm, rhetorical habits, and qualitative voice markers. Solo builders use it to stop re-pasting style guides into every chat when they ship newsletters, docs, landing updates, or support macros. The module also explains how to spin context-specific registers by re-running extraction on focused samples and documenting only deltas through Inherits, Overrides, and Additions blocks. Detection hooks describe how the companion voice-generate skill should pick a register when the user names a mode like casual or technical. Estimated footprint is modest (~400 tokens in metadata), but the outcome is filesystem-backed voice assets agents can reload across sessions.
- Creates default register at ~/.claude/voice-profiles/{name}/registers/default.md from extraction sections
- Maps extraction blocks to Vocabulary, Sentence Structure, Rhetorical Techniques, and Voice Qualities
- Supports additional registers (casual, technical, narrative, advocacy) via subset re-extraction and overrides
- Non-default registers inherit default with explicit Overrides and Additions sections
- Feeds voice-generate skill register selection from explicit user context or detection rules
Voice Extract by the numbers
- 74 all-time installs (skills.sh)
- Ranked #1,207 of 1,879 Marketing & SEO skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/athola/claude-night-market --skill voice-extractAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 74 |
|---|---|
| repo stars | ★ 325 |
| Security audit | 2 / 3 scanners passed |
| Last updated | August 2, 2026 |
| Repository | athola/claude-night-market ↗ |
How do I turn voice extraction output into default and contextual writing registers stored under ~/.claude/voice-profiles for consistent branded copy.?
Turn voice extraction output into default and contextual writing registers stored under ~/.claude/voice-profiles for consistent branded copy.
Who is it for?
Best when you're working on marketing & seo and need structured help with voice extract.
Skip if: Teams with no marketing & seo needs, or anyone wanting a generic chat assistant without this specific workflow.
When should I use this skill?
When you need to turn voice extraction output into default and contextual writing registers stored under ~/.claude/voice-profiles for consistent branded copy., or when voice-extract is the register-creation module in the
What you get
Structured output aligned to voice-extract: Creates default register at ~/.claude/voice-profiles/{name}/registers/default.md from extraction sections, Maps extraction blocks to Vocabulary, Sentence Structure, Rhetorical
Files
Voice Extraction Skill
Extract a user's writing voice through SICO comparative analysis.
Method: Comparative Feature Extraction
Rather than measuring surface metrics, this skill uses SICO Phase 1: feed the model user writing samples alongside its own default output on the same topics. The model describes what the user does differently. This produces voice descriptions that encode implicit structural patterns no metrics can capture.
Key Principles (from research)
1. Anonymize samples: Label as "Sample 1", "Sample 2", etc. Context labels cause the extractor to anchor on content rather than reading a unified voice.
2. Variety over volume: 10 samples across different topics beats 20 on the same subject. The extraction needs to see what stays constant when everything else changes.
3. Casual writing is distinctive: Reddit comments, slack messages, quick emails. Polished pieces have rough edges edited away, and those edges are where voice lives.
4. Pressure test for specificity: If extraction output sounds generic ("uses varied sentence lengths"), run pass 2 and force specificity. Good output reads like followable instructions, not a book report.
5. Use Opus for extraction: More nuanced feature descriptions, especially for registers where subtle tonal shifts matter.
Required TodoWrite Items
1. voice-extract:samples-collected - Writing samples gathered 2. voice-extract:samples-anonymized - Labels stripped, numbered 3. voice-extract:baseline-generated - Claude's default output on same topics 4. voice-extract:extraction-pass-1 - Broad comparative features 5. voice-extract:extraction-pass-2 - Pressure test for specificity 6. voice-extract:profile-written - extraction.md created
Step 1: Sample Intake
Load: @modules/sample-intake
Directory Mode
# Scan for samples
PROFILE_DIR="$HOME/.claude/voice-profiles/{name}"
mkdir -p "$PROFILE_DIR/samples"
# Copy samples from user-provided directory
# Rename to Sample-01.md, Sample-02.md, etc.Interactive Mode
Present the user with:
Paste your writing sample below (minimum 200 words).
Type END on a new line when done.Repeat until user says "done collecting" or reaches 10+ samples.
Manifest
Create manifest.json:
{
"profile_name": "{name}",
"created": "YYYY-MM-DD",
"samples": [
{
"id": "sample-01",
"original_source": "anonymized",
"word_count": 450,
"date_added": "YYYY-MM-DD"
}
],
"extraction_model": "opus",
"extraction_date": null,
"registers": ["default"]
}Validation
- Minimum 3 samples
- Minimum 500 words total
- Each sample minimum 100 words
- Variety check: warn if all samples share obvious topic
Step 2: Baseline Generation
For each sample's topic/context, generate Claude's default output on the same subject. This creates the comparison pair.
Prompt for baseline:
Write a short piece about [topic extracted from sample].
Use your natural default style. Do not try to match any
particular voice or style. Just write naturally about this
subject in approximately [word_count] words.Store baselines alongside samples for comparison.
Step 3: SICO Extraction Pass 1
Load: @modules/sico-extraction
The core comparative prompt:
I'm going to show you pairs of text. In each pair:
- Text A is written by a specific person
- Text B is your default output on the same topic
Your task: describe what the writer of Text A does
differently from your default style. Focus on:
- Structural patterns (paragraph shapes, section architecture)
- Rhetorical moves (how they build arguments, make transitions)
- Tonal devices (hedging patterns, commitment patterns)
- Sentence-level techniques (clause structure, rhythm)
- Vocabulary tendencies (physical vs abstract language,
technical vs conversational)
- Distinctive habits (parentheticals, fragments, questions)
Do NOT describe surface metrics (average sentence length,
word count). Describe the voice in terms a writer could
follow. Be specific enough that someone could use your
description to imitate this voice.
[Pairs follow]Quality Gate
If the extraction output contains any of these generic phrases, reject and re-run with higher specificity demand:
- "uses varied sentence lengths"
- "maintains a conversational tone"
- "balances formal and informal"
- "engages the reader"
- "creates a sense of"
Step 4: Extraction Pass 2 (Pressure Test)
Review your feature description. For each characteristic
you identified, answer:
1. Could this describe 50% of writers? If yes, be more
specific or remove it.
2. Can someone follow this as a concrete instruction?
If not, add an example from the samples.
3. Are there patterns you noticed but didn't name?
Writers often have unnamed habits. Look for:
- How they use parentheticals
- Where they commit vs hedge
- Physical language for abstract concepts
- Rhythm of building caution then dropping unhedged claims
- How they anticipate reader objections
Revise your description to be more specific and followable.Step 5: Write Profile
Write the extraction to ~/.claude/voice-profiles/{name}/extraction.md:
# Voice Extraction: {name}
## Feature Description
[SICO extraction output here]
## Craft Rules (Detection-Neutral)
These techniques improve writing without increasing
AI detectability:
- Concrete-first: Lead with specific, physical details
- Naming: Label patterns and dynamics explicitly
- Opening moves: Start mid-thought or with a specific moment
- Human-moment anchoring: Ground abstractions in lived experience
- Aphoristic destinations: Write sentences worth repeating alone
## Banned Phrases
[Standard AI vocabulary list + user additions]
## Notes
- Extraction model: {model}
- Extraction date: {date}
- Sample count: {n}
- Total word count: {words}Create default register at registers/default.md from the extraction output.
Exit Criteria
- Profile directory exists with manifest
- extraction.md contains specific, followable voice description
- Default register created
- No generic phrases in extraction output
- User has reviewed and confirmed the extraction captures
their voice
Register Creation Module
Create voice registers from extraction output.
Default Register
After extraction completes, create the default register at ~/.claude/voice-profiles/{name}/registers/default.md:
# Register: default
## Context
Default writing voice for {profile_name}. Use when no
specific register is requested.
## Vocabulary
{extraction vocabulary section - actionable directives}
## Sentence Structure
{extraction sentence structure section}
## Rhetorical Techniques
{extraction rhetorical techniques section}
## Voice Qualities
{extraction voice qualities section}Additional Registers
Users may want registers for different contexts (casual, technical, narrative, advocacy). To create an additional register:
1. Select samples that represent that specific context 2. Re-run extraction on the subset 3. Identify what differs from the default register 4. Create a register file with only the differences
Register file for non-default:
# Register: {name}
## Context
{When to use this register}
## Inherits
default (all features from default apply unless overridden)
## Overrides
{Features that differ from default register}
## Additions
{Features unique to this register not in default}Register Detection
When the voice-generate skill activates, select register by:
1. Explicit user request ("use casual register") 2. Context matching (if register has context triggers) 3. Default fallback
Per-Project Overrides
If .voice/override.md exists in the project root, merge its contents with the active register. Project overrides take precedence over profile-level features.
# Project Voice Override
## Context
{Why this project needs different voice settings}
## Overrides
{Features to change for this project}
## Additional Banned Phrases
{Project-specific phrases to avoid}Sample Intake Module
Collect and organize writing samples for voice extraction.
Directory Mode
When user provides a path to a directory of writing samples:
PROFILE_NAME="$1"
SAMPLE_DIR="$2"
PROFILE_DIR="$HOME/.claude/voice-profiles/$PROFILE_NAME"
mkdir -p "$PROFILE_DIR/samples"
mkdir -p "$PROFILE_DIR/registers"
mkdir -p "$PROFILE_DIR/learning/snapshots"
# Copy and anonymize samples
counter=1
for f in "$SAMPLE_DIR"/*.{md,txt} 2>/dev/null; do
[ -f "$f" ] || continue
padded=$(printf "%02d" $counter)
cp "$f" "$PROFILE_DIR/samples/sample-${padded}.md"
counter=$((counter + 1))
doneInteractive Mode
Prompt user to paste samples one at a time:
1. Present: "Paste writing sample (min 100 words). Type END on a new line when done." 2. Save to samples/sample-{nn}.md 3. Report word count 4. Ask: "Add another sample? (yes/done)" 5. Repeat until "done" or 20 samples reached
Validation Rules
| Check | Threshold | Action |
|---|---|---|
| Sample count | >= 3 | Error if below |
| Total words | >= 500 | Error if below |
| Per-sample words | >= 100 | Warn, allow |
| Topic variety | 3+ distinct topics | Warn if all same |
Manifest Creation
After intake, write manifest.json:
{
"profile_name": "NAME",
"created": "YYYY-MM-DD",
"samples": [
{
"id": "sample-01",
"word_count": 450,
"date_added": "YYYY-MM-DD",
"original_filename": "anonymized"
}
],
"extraction": {
"model": null,
"date": null,
"passes_completed": 0
},
"registers": ["default"],
"learning": {
"snapshot_count": 0,
"accumulator_entries": 0,
"last_learning_pass": null
}
}Anonymization
Strip all context from samples before extraction:
- Remove filenames from headers
- Remove dates, URLs, proper nouns that identify source
- Label only as "Sample 01", "Sample 02", etc.
- Never tell the extractor what platform or context a sample is from
This forces the extraction to focus on structural and stylistic patterns rather than anchoring on content or context.
SICO Extraction Module
Comparative feature extraction using SICO Phase 1 methodology.
Baseline Generation
For each sample, generate Claude's default output on a matched topic. The baseline reveals what the model does naturally so the extraction can identify divergences.
Baseline prompt (per sample):
Write a short piece (~{word_count} words) about the following
topic. Use your natural default style. Do not try to match
any particular voice or style. Write naturally.
Topic: {topic_summary_from_sample}Store baselines in memory (not persisted). They exist only for the comparison step.
Pass 1: Broad Comparative Extraction
Prompt structure:
I will show you pairs of text. In each pair:
- Text A is written by a specific person
- Text B is your default output on the same topic
Describe what the writer of Text A does differently from your
default style. Focus on:
1. STRUCTURAL PATTERNS
- Paragraph shapes and lengths
- Section architecture (how pieces are organized)
- Information sequencing (when details arrive)
2. RHETORICAL MOVES
- How arguments build (linear? recursive? tangential?)
- Transition style (smooth? abrupt? absent?)
- How evidence is introduced
3. TONAL DEVICES
- Hedging patterns (where they commit vs equivocate)
- Authority level (when do they assert vs defer?)
- Humor or irreverence patterns
4. SENTENCE-LEVEL TECHNIQUES
- Clause structure and complexity
- Fragment usage and placement
- Parenthetical habits (anticipating objections? asides?)
5. VOCABULARY TENDENCIES
- Abstract vs physical language
- Technical vs conversational register
- Specific word preferences or avoidances
6. DISTINCTIVE HABITS
- Unnamed patterns that don't fit other categories
- Recurring moves unique to this writer
7. STRATEGIC INEFFICIENCIES
- Deliberate detours, pauses, tangents
- Syntactic variations that serve no logical purpose but
create texture
- Places where the writer is "inefficient" on purpose
- These are what LLMs naturally optimize away, so they
are critical to preserve
8. NEGATIONS (what this writer would NEVER do)
- Phrases or structures they avoid
- Tones they never adopt
- Moves that would feel wrong in their voice
- This is often MORE revealing than positive patterns
Write each finding as an actionable instruction someone could
follow to reproduce this voice. NOT observational language
("tends to use"). Instead: "Use X when Y" or "Open with Z".
For negations: "NEVER do X" or "Avoid Y because it clashes
with Z characteristic".
---
{pairs of samples and baselines}Pass 2: Pressure Test
After Pass 1 produces a feature description, run the pressure test to eliminate generic observations:
Review your feature description below. Apply three checks:
SPECIFICITY CHECK:
For each feature, ask: "Would 50% of writers do this?"
If yes, either make it more specific or remove it.
- BAD: "Varies sentence length" (everyone does this)
- GOOD: "Alternates 3-word fragments after 30-word
accumulative sentences to create rhythmic punch"
COMPLETENESS CHECK:
Scan the samples again for patterns you missed:
- How do they handle uncertainty?
- What are their opening moves?
- Do they use parentheticals? How?
- What is the rhythm between caution and commitment?
- How do they ground abstractions in physical language?
- Do they anticipate reader objections? Where?
OPERATIONALITY CHECK:
Convert each feature to a followable instruction.
Test: "Could someone reproduce this pattern from
my description alone, without seeing the samples?"
If not, add a concrete example from the text.
Revise the full description. Output the final version.
---
Current description:
{pass_1_output}Quality Gate
Reject extraction output that contains these generic phrases:
- "uses varied sentence lengths"
- "maintains a conversational tone"
- "balances formal and informal"
- "engages the reader"
- "creates a sense of"
- "tends to"
- "often uses"
- "frequently employs"
If any are present, re-run with: "Your description contains generic observations. Be more specific. Each feature must describe something THIS writer does that most writers don't."
Output Format
The final extraction goes into extraction.md with four sections matching the register template:
1. Vocabulary - Word choice patterns, formality, terminology 2. Sentence Structure - Length patterns, complexity, rhythm 3. Rhetorical Techniques - Argument structure, evidence, logic 4. Voice Qualities - Personality, tone, reader relationship
Related skills
FAQ
What does voice-extract do?
Voice-extract is the register-creation module in the Claude Night Market voice stack.
When should I use voice-extract?
When you need to turn voice extraction output into default and contextual writing registers stored under ~/.claude/voice-profiles for consistent branded copy., or when voice-extract is the register-creation module in the claude night market voice stack.
What are the main capabilities?
Creates default register at ~/.claude/voice-profiles/{name}/registers/default.md from extraction sections; Maps extraction blocks to Vocabulary, Sentence Structure, Rhetorical Techniques, and Voice Qualities; Supports additional registers (casual, technical, narrative, advocacy)
Is Voice Extract safe to install?
skills.sh reports 2 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.