
Voice Generate
- 73 installs
- 325 repo stars
- Updated August 2, 2026
- athola/claude-night-market
voice-generate is an agent skill that runs a staged voice pipeline from notes through Opus generation, auto-fix, and optional review.
About
voice-generate is a Claude Night Market generation-pipeline module that takes source material framed as raw notes, loads voice profile plus register and craft rules, and produces reviewed-ready text using Opus for tonal control. Immediately after generation it silently applies context-aware em dash replacement and swaps or removes common AI-ish phrases before any human sees the draft. Builders can optionally snapshot pre-review state, dispatch parallel review agents, present advisories, apply user decisions, and snapshot again when learning mode is active; final text may still be hand-edited with /voice-learn capturing deltas later. Estimated footprint is on the order of five hundred tokens for the module stub, with dependencies on Read, Write, and Agent primitives. Use it when you want repeatable branded copy without re-litigating style rules in every chat thread.
- End-to-end pipeline: frame notes → profile/register/craft rules → Opus generate → auto-fix → optional review agents → us
- Silent auto-fix for em dashes and a fixed banned-phrase list (Furthermore, delve, leverage, seamless, etc.)
- Model routing table: Opus for generation; regex for auto-fix; optional review dispatch
- Optional learning snapshots pre/post review and user-triggered /voice-learn after edits
Voice Generate by the numbers
- 73 all-time installs (skills.sh)
- Ranked #844 of 1,335 Generative Media 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-generateAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 73 |
|---|---|
| repo stars | ★ 325 |
| Security audit | 2 / 3 scanners passed |
| Last updated | August 2, 2026 |
| Repository | athola/claude-night-market ↗ |
What it does
Turn raw notes or source material into on-brand voice text with Opus generation, silent style fixes, and optional multi-agent review before publish.
Who is it for?
Best when you're producing newsletters, landing copy, or lifecycle emails and already maintain a voice profile in the Night Market stack.
Skip if: One-off code generation, audio TTS rendering, or teams without a defined register/craft rules file to load.
When should I use this skill?
You have source material to turn into voice-aligned text and want generation-pipeline auto-fix plus optional review.
What you get
You get auto-corrected, review-ready voice text with optional agent advisories applied to your decisions, ready to publish or feed /voice-learn.
- Auto-fixed generated voice text
- Optional review advisories and post-decision final draft
By the numbers
- Pipeline documents 8+ sequential stages from source material to optional /voice-learn
- Silent auto-fix covers em dashes plus 8+ named banned phrase patterns
- Module metadata lists estimated_tokens: 500
Files
Voice Generation Skill
Generate text in a user's extracted writing voice.
Core Principle: Source Material Framing
The single largest variable in output quality is how source material is framed in the prompt. Material framed as "raw notes I'm still thinking through" produces text that feels like thinking. Material framed as summaries produces reporting.
Always frame user-provided source material as raw notes unless the user explicitly requests otherwise.
Required TodoWrite Items
1. voice-generate:profile-loaded - Voice profile read 2. voice-generate:register-selected - Register chosen 3. voice-generate:source-framed - Material framed as notes 4. voice-generate:generated - Text produced 5. voice-generate:review-dispatched - Sent to review agents
Step 1: Load Voice Profile
PROFILE_DIR="$HOME/.claude/voice-profiles/{name}"Read in order: 1. extraction.md - Core voice features 2. registers/{register}.md - Active register 3. craft-rules.md - Shared craft techniques (if exists) 4. banned-phrases.md - Anti-patterns to avoid (if exists)
Check for per-project override:
if [ -f ".voice/override.md" ]; then
# Merge project overrides with profile
fiStep 2: Register Selection
Load: @modules/register-selection
Select register by: 1. Explicit user request ("use casual register") 2. Context matching from register metadata 3. Default fallback to registers/default.md
Step 3: Frame Source Material
Load: @modules/source-framing
Default framing (always use unless user overrides):
Below are my rough notes on this topic. I'm still thinking
through these ideas. Use them as the raw material for the
piece, not as a structure to follow:
---
{user_provided_source_material}
---Alternative framings (only if user requests):
- "structured outline" - when user wants to preserve structure
- "key points to cover" - when user provides bullet points
- "conversation to draw from" - when source is a transcript
Step 4: Generation Prompt
Compose the generation prompt:
You are writing a piece in a specific voice. The voice
features below were extracted from the writer's own work.
Follow them as concrete instructions, not suggestions.
## Voice Features
{extraction.md content}
## Active Register: {register_name}
{register content}
## Craft Techniques (apply all)
- Concrete-first: Lead with specific, physical details before
any abstraction
- Naming: When you describe a pattern in 2+ sentences, compress
it into a 2-4 word label
- Opening moves: Start mid-thought, with a specific moment, or
with a counterintuitive claim. Never start with throat-clearing
- Human-moment anchoring: Ground every abstraction in a specific
scene or lived experience
- Aphoristic destinations: At least one sentence per section
should be worth repeating out of context
## Banned (never use)
{banned_phrases content, or default list:}
- Em dashes (use commas, colons, semicolons, parentheses)
- "delve", "utilize", "leverage", "facilitate"
- "it's important to note", "in today's world"
- "here's the thing", "let that sink in"
- "furthermore", "moreover", "comprehensive"
- Negation-correction patterns ("This isn't X. This is Y.")
## Source Material
{framed source material from Step 3}
## Task
Write the piece. Follow the voice features precisely. Apply
craft techniques. Do not use any banned phrases. The output
should read as if the writer produced it themselves.
Length: {user_specified or ~same as source material}
Format: {user_specified or prose paragraphs}Step 5: Post-Generation
After generation: 1. Scan output for banned phrases (auto-fix silently) 2. Check for em dashes (replace with appropriate punctuation) 3. Dispatch to voice-review skill if user wants review 4. Save pre-review snapshot if learning mode is active
Model Routing
- Generation: Use Opus. Tonal shifts, parenthetical
subversion, and subtle voice qualities require the larger model. Sonnet flattens these.
- Banned phrase scan: Can run locally (regex/grep)
- Review agents: Sonnet is sufficient (the prompts are
templated, so Opus tonal range is not needed)
Per-Project Voice
If .voice/override.md exists in the current project:
- Read override content
- Merge with profile (overrides take precedence)
- Note in output: "Applied project voice override"
Exit Criteria
- Text generated in the specified voice
- No banned phrases present
- Craft techniques applied (concrete-first, naming, etc.)
- Source material framed as raw notes
- Review dispatched (if requested)
- Snapshot saved (if learning mode active)
Generation Pipeline Module
End-to-end generation flow from source material to reviewed text.
Pipeline Stages
Source Material
|
v
[Frame as raw notes]
|
v
[Load profile + register + craft rules]
|
v
[Generate with Opus]
|
v
[Auto-fix: banned phrases, em dashes]
|
v
[Snapshot: pre-review] (if learning active)
|
v
[Dispatch review agents] (optional)
|
v
[Present advisories to user]
|
v
[Apply user decisions]
|
v
[Snapshot: post-review] (if learning active)
|
v
Final text (user may edit further)
|
v
[/voice-learn captures post-edit] (user-triggered)Auto-Fix Rules (Silent)
Applied immediately after generation, before review:
# Em dash replacement (context-aware)
# Before a clause: use comma or colon
# Parenthetical: use parentheses
# List separator: use semicolons
# Banned phrase removal
# "Furthermore," -> "" (start sentence without it)
# "It's important to note" -> "" (remove entirely)
# "delve" -> "explore" or "examine"
# "utilize" -> "use"
# "leverage" -> "use" or remove
# "comprehensive" -> "thorough" or "complete"
# "robust" -> "solid" or remove
# "seamless" -> "smooth" or removeModel Routing
| Stage | Model | Reason |
|---|---|---|
| Generation | Opus | Tonal shifts, parenthetical subversion |
| Auto-fix | Regex/local | No model needed |
| Prose review | Sonnet | Structured detection prompts |
| Craft review | Sonnet | Structured evaluation prompts |
| Learning analysis | Opus | Nuanced pattern comparison |
Error Recovery
If generation fails quality checks (> 5 hard failures): 1. Re-generate with stronger emphasis on banned phrases 2. If second attempt still fails, present to user with warning 3. Never loop more than twice (prevents infinite retry)
Streaming Considerations
For long-form content (> 1000 words):
- Generate in sections (one per major heading)
- Apply auto-fix per section
- Allow user to review section-by-section or all at once
- Snapshot captures the complete assembled text
Register Selection Module
Choose the appropriate voice register for generation.
Selection Priority
1. Explicit request: User says "use casual register" 2. Context match: Register metadata matches the task 3. Default: Fall back to registers/default.md
Context Matching
Each register file has a ## Context section describing when to use it. Match against the user's stated purpose:
User: "Write a blog post about..." -> default or narrative
User: "Draft a technical doc for..." -> technical
User: "Reply to this Reddit thread..." -> casual
User: "Write an email to my team..." -> professionalRegister Loading
PROFILE_DIR="$HOME/.claude/voice-profiles/$PROFILE_NAME"
REGISTER_FILE="$PROFILE_DIR/registers/${REGISTER_NAME}.md"
if [ ! -f "$REGISTER_FILE" ]; then
echo "Register '$REGISTER_NAME' not found. Available:"
ls "$PROFILE_DIR/registers/"
echo "Using default register."
REGISTER_FILE="$PROFILE_DIR/registers/default.md"
fiInheritance
Non-default registers inherit from default unless they explicitly override a section. When loading a non-default register:
1. Read default.md as base 2. Read {name}.md for overrides and additions 3. Merge: override sections replace, additions append
Listing Available Registers
When user asks what registers exist:
echo "Available voice registers for $PROFILE_NAME:"
for f in "$PROFILE_DIR/registers/"*.md; do
name=$(basename "$f" .md)
context=$(grep -A1 "^## Context" "$f" | tail -1)
echo " $name: $context"
doneSource Framing Module
How source material is framed in the prompt is the single largest variable in output quality. Larger than voice rules. Larger than model choice.
The Framing Lever
When material is framed as "raw notes I'm still thinking through," the output is dramatically better than when framed as "a transcript to draw on" or a bare topic sentence.
The framing changes how the model relates to the material:
- Notes to think through -> text that feels like thinking
- Summaries to report on -> text that feels like reporting
- Transcripts to draw from -> text that feels like paraphrase
Default Framing (always use)
Below are my rough notes on this topic. I'm still working
through these ideas and haven't settled on a final structure.
Use them as raw material for thinking, not as an outline
to follow:
---
{source_material}
---
Write a piece that engages with these ideas in the voice
described above. You don't need to cover everything in the
notes. Follow where the interesting threads lead.When User Provides Structured Input
If the user gives bullet points or an outline, still reframe as notes:
Below are my working notes. These bullet points represent
threads I'm pulling on, not a structure to reproduce:
---
{bullet_points}
---When User Provides a Topic Only
If just a topic sentence or phrase:
I want to write about: {topic}
Here's what I'm thinking so far: I don't have notes yet,
but the angle I'm interested in is {topic}. Write an
exploratory piece that discovers its argument as it goes.Override Framings
Only use these if the user explicitly requests a different relationship to the source material:
"Preserve my structure"
Below is an outline I want to follow. Keep the structure
but write each section in the voice described above:"Respond to this"
Below is something I'm responding to. Write a response
in the voice described above:"Expand these points"
Below are key points I want to develop. Expand each one
into full prose in the voice described above:Related skills
How it compares
Structured voice pipeline with mandatory style auto-fix—not a generic “write a blog post” prompt or an MCP connector.
FAQ
Who is voice-generate for?
Developers using athola Claude Night Market who want procedural copy generation that respects profile, register, and craft rules.
When should I use voice-generate?
Use in Grow/content for lifecycle copy; in Validate/landing for draft page narrative; in Launch/distribution when turning notes into channel-ready posts after optional review agents.
Is voice-generate safe to install?
It depends on Read/Write/Agent access to your notes and profiles; review the Security Audits panel on this Prism page and scope filesystem paths before enabling review sub-agents.