Agent skill · Documentation

voice-extractor

Capture a user's real writing voice from 5-20 prior samples, store a local voice.yaml fingerprint, and enforce it on newsjack drafts so AI tells disappear. Measures voice with named stylometry lenses (Burrows's Delta function-word vector, MATTR lexical diversity, sentence-length burstiness, Biber Dimension-1 register, opener-POS profile, punctuation rates) and gates drafts against the fingerprint as bands, not vibes.

Elvis Sun613★ · +7/wk · 1 repos on radarProfile →
claude-codeMIT
Install
npx skills add elvisun/newsjack --skill voice-extractor --agent claude-code

Same command for any agent — swap --agent for codex, cursor, copilot.

Facts
Files in the skill folder: 1
SKILL.md size: 32 KB
Bundled scripts: none
Path: skills/voice-extractor/SKILL.md
Open the folder on GitHub →
Where it comes from
Stars: 620 · +7 this week
Language: Go
Read our review of the source →

Weekly change comes from our own snapshots, not the repository page — it measures attention, not adoption.

Review
written from the skill's own SKILL.md · Aug 5, 2026

What it does

The skill builds a local voice fingerprint from user-provided samples and enforces that voice on drafts by comparing them to a defined banded profile. It uses multiple linguistic lenses (function-word delta, burstiness, MATTR lexical diversity, punctuation rates, opener-POS profile, register via Biber Dimension-1, and signature n-grams) to compute a set of measurable habits and then blocks or flags deviations when a draft drifts from the fingerprint. The fingerprint resides in ~/.newsjack/voice/<profile_id>.yaml with active.yaml pointing to the current profile, and it stores metadata like created_at and last_extracted_at. It operates with a rule-based system: for extraction, check, and enforcement modes, it defines specific rules and blocks to ensure the draft remains within the user’s voice bands.

How it works

  • Extraction mode collects 5-20 samples and computes fingerprint schema fields across multiple lenses, including cadence, mechanics, sentence-initial habits, idiom set, banned words and structures, openers/closers, topic/perspective, and sample inventory.
  • The fingerprint is stored as a YAML file under the local path and linked via active.yaml; raw samples are not stored in voice.yaml.
  • The check mode re-computes lens measurements on a draft, diffs against stored bands, and emits violations per fired rule in a fixed order: hard blocks, cadence/register drift, then vocabulary drift.
  • The enforce mode loads the active fingerprint, passes it into the drafting process as a voice constraint block, runs a check, and, if needed, performs up to two redrafts when hard blocks appear.
  • It defines explicit rules for each lens (e.g., delta_drift, low_burstiness, lexical_diversity_drop, em_dash_against_fingerprint, conjunction_starts_allowed, etc.) and ties them to concrete quotas and thresholds.

When to use it

Use when a user wants to: set up a personal voice fingerprint, refresh an existing fingerprint, check a draft against the active fingerprint, or enforce voice constraints during drafting by other skills.

What it can touch

The fingerprint is stored locally at ~/.newsjack/voice/<profile_id>.yaml and active.yaml points to the active profile. It uses the declared tool "claude-code" for any required automation in the workflow.

Caveats

  • Local-only storage: fingerprints live on the user’s machine; no raw samples are stored in voice.yaml.
  • The system relies on measured thresholds derived from the user’s own samples; deviations outside bands trigger gates but depend on explicit user-provided samples and context.
  • The approach is rule-based and deterministic, not probabilistic; it does not infer truth beyond the defined lenses and bands.
From the SKILL.md

# Voice Extractor You are the **Voice Extractor** for newsjack.sh: the local voice fingerprint engine. Your job is to make copy written under the user's name sound like the user, not like a model trying to sound generally human. You are mechanical, exacting, and suspicious of AI slop. You do not roast drafts. `meanest-editor` is the editorial judgment layer; you are the rule-matcher and fingerprint enforcer it can call. The core move: a voice is a **vector of measurable habits** — how long sentences run and how much that varies, which function words recur, how punctuation falls, how sentences open, how casual or nominal the register is. Measure those at extraction, store each as a number with a tolerance band, then on every draft recompute the same numbers and fire a rule wherever the draft leaves the band. "Make it sound like me" becomes a set of deterministic, span-located, fixable gates. ## Operating Doctrine - Local first. Fingerprints live at `~/.newsjack/voice/<profile_id>.yaml`; `active.yaml` points to the active profile. Never store raw sample text inside `voice.yaml`. - Voice is a signature. Do not build a fingerprint of someone else from public writing unless the user is

What's inside
Steps it walks through
  1. Operating Doctrine
  2. The Linguistic Lenses — how to measure a voice
  3. 1. Function-word signature (Burrows's Delta)
  4. 2. Burstiness — sentence-length variance, not just the mean (Gary Provost)
  5. 3. Lexical diversity (MATTR, never raw TTR)
  6. 4. Punctuation-habit profile
  7. 5. Opener-POS profile (Roy Peter Clark)
  8. 6. Register dimension — involved vs. informational (Biber Dimension-1)
  9. 7. Signature n-grams (keyness)
  10. 8. The inverse fingerprint — named AI tells (flag these)
  11. Modes
  12. Mode: Extract
  13. Step 1 - Ask For Scope
  14. Step 2 - Triage The Corpus
More from newsjack
All skills →
About this skill
What does the voice-extractor skill do?

Capture a user's real writing voice from 5-20 prior samples, store a local voice.yaml fingerprint, and enforce it on newsjack drafts so AI tells disappear. Measures voice with named stylometry lenses (Burrows's Delta function-word vector, MATTR lexical diversity, sentence-length burstiness, Biber Dimension-1 register, opener-POS profile, punctuation rates) and gates drafts against the fingerprint as bands, not vibes.

How do I install it?

Run `npx skills add elvisun/newsjack --skill voice-extractor --agent claude-code` — it drops the skill into your project so the agent can pick it up. Swap the --agent value for codex, cursor or copilot if you use one of those.

Where does this skill come from?

From elvisun/newsjack, a repository with 620 stars. We read it straight from the repository tree rather than a submitted listing, so what you see here is what is actually published.

Is a popular skill a good skill?

Not necessarily. Stars measure attention, not adoption — a repository can trend for a week and be abandoned. That is why we show the weekly change from our own snapshots next to the total, instead of a single flattering number.

Keep going