{"slug":"authors-voice","title":"authors-voice","summary":"Author's Voice — constructed-voice skill. Anchors writing to a training-data author blend, progressively layers NEVER rules, presentation fingerprints, sentence stats, coined terms, and curated examples from a growing local corpus. Pure markdown, opus sub-agent (the minion) write","platform":"Claude","tags":[],"authorName":"LLM Mart","authorSlug":"llm-mart","score":0,"source":"github","price":null,"verified":false,"createdAt":"2026-09-29T15:22:30.786643Z","repo":{"url":"https://github.com/travsteward/openwriter","stars":31,"forks":1,"license":"MIT","updatedAt":"2026-09-29T14:48:54Z"},"bodyHtml":"<h1>authors-voice</h1>\n<blockquote>\n<p><strong>AI writing that sounds like you, not AI.</strong></p>\n</blockquote>\n<p>Most attempts to make AI sound like you start the same way. Train it. Fine-tune it. Feed it your samples and tell it to imitate. The model doesn't actually learn you from any of this. It pattern-matches at the lexical layer, lifting your common words and sentence shapes without ever building a deep representation of how you think. Cold-start imitation tops out shallow.</p>\n<p>Flip the direction. The model already carries deep internal representations of widely-published authors it was trained on at scale, voices it can channel with real fidelity because it saw thousands of pages of each. The move is to identify which of those authors a user statistically resembles, assign proportional weights to the closest matches, and instruct the model to write as that weighted blend. Your voice gets reconstructed as a coordinate inside the model's existing author space, anchored to authors it has already mastered.</p>\n<p>That changes the problem. The model isn't being asked to learn anything new about you. It's being asked to mix voices it knows cold, in proportions that triangulate your position among them. The anchor does the heavy lifting before a single sample of yours enters the prompt. The blend is the voice.</p>\n<p>The result is AI writing that sounds like you. Not AI imitating you.</p>\n<p>On top of the anchor, four layers sharpen the output. A list of AI words and constructions the model must never use, because the moment it stops channeling the anchor it reverts to its trained register and reaches for the same fifty tells. Presentation choices you make consistently, like whether you capitalize after a colon or use the Oxford comma, small mechanical preferences that read as authentic. A sentence-length and punctuation rhythm pulled from your own writing, so the cadence matches even when the diction is on loan. A growing folder of your samples that the skill mines as the negative rules and rhythm get re-derived.</p>\n<p>Each sample you add updates the NEVER rules and the sentence rhythm against your latest corpus. The anchor and presentation fingerprints don't auto-refresh. Regenerate those when you've added enough new writing to shift the matches, or when you want a fresh pass. The profile gets sharper the more you write and the more often you ask for a refresh.</p>\n<p>Roughly 80% of the way to your real voice. A hard jump above what stock prompting and fine-tuning produce.</p>\n<h2>Install</h2>\n<p>The skill is <strong>agent-agnostic</strong>. Pure markdown, no language runtime. Any LLM-based agent that can read <code>SKILL.md</code> and follow instructions can use it.</p>\n<h3>Claude Code</h3>\n<pre><code>claude install github:travsteward/authors-voice\n</code></pre>\n<p>Clones to <code>~/.claude/skills/authors-voice/</code> and registers the skill with Claude Code.</p>\n<h3>Vercel skills CLI (Claude Code, Codex, Cursor, and other agents)</h3>\n<pre><code>npx skills add travsteward/authors-voice\n</code></pre>\n<h3>Manual (any agent)</h3>\n<pre><code>git clone https://github.com/travsteward/authors-voice\n</code></pre>\n<p>Then drop the cloned folder wherever your agent loads skills from. The <code>SKILL.md</code> at the root has the trigger phrases and routing logic the agent reads.</p>\n<h2>Quick Start</h2>\n<p>Two paths. Pick one.</p>\n<p><strong>Path A: Web tool first (fastest first-run)</strong></p>\n<ol>\n<li>Visit <a href=\"https://openwriter.io/voice-match\">openwriter.io/voice-match</a>, paste 300 to 800 words of your writing, copy the result block.</li>\n<li>Tell your agent: <em>\"set up my voice match\"</em>. Paste the block when prompted.</li>\n<li><strong>Seed your corpus</strong>: paste 2 to 5 paragraphs that feel most like you. The agent saves them under <code>voice/corpus/</code>.</li>\n<li>Done.</li>\n</ol>\n<p><strong>Path B: Skill mode (no web round-trip)</strong></p>\n<ol>\n<li>Tell your agent: <em>\"set up my voice match\"</em> and <em>\"I want to skip the web tool.\"</em></li>\n<li>Paste 2 to 5 paragraphs of your writing. The agent saves them under <code>voice/corpus/</code>.</li>\n<li>The agent runs the Anchor Protocol over your corpus and writes <code>voice/anchor.md</code> directly.</li>\n<li>Done.</li>\n</ol>\n<p>The skill is self-routing. You don't memorize subcommands. Just tell the agent what you want:</p>\n<ul>\n<li><em>\"voice status\"</em> → reports your current tier and word count</li>\n<li><em>\"add this essay to my voice profile\"</em> → appends, re-analyzes</li>\n<li><em>\"write me a tweet about X\"</em> → uses your voice automatically</li>\n</ul>\n<h2>How It Works</h2>\n<p>Your voice profile lives in <code>voice/</code> as a handful of <code>.md</code> files the agent reads at write time:</p>\n<table>\n<thead>\n<tr>\n<th>File</th>\n<th>Source</th>\n<th>Purpose</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td><code>anchor.md</code></td>\n<td>One-time match from <a href=\"https://openwriter.io/voice-match\">openwriter.io/voice-match</a> (or skill-mode). Refresh on demand.</td>\n<td>3 to 5 training-data authors with weights</td>\n</tr>\n<tr>\n<td><code>stats.md</code></td>\n<td>Auto-regenerated from corpus on every analysis run</td>\n<td>Sentence distribution + punctuation density</td>\n</tr>\n<tr>\n<td><code>never-rules.md</code></td>\n<td>Auto-regenerated from corpus on every analysis run. Manual additions preserved.</td>\n<td>AI words and phrases the model must never use</td>\n</tr>\n<tr>\n<td><code>fingerprints.md</code></td>\n<td>Agent extracts from corpus during analysis runs. Manual overrides preserved.</td>\n<td>Presentation choices (Oxford comma, capitalization after colon, contraction frequency)</td>\n</tr>\n<tr>\n<td><code>coined-terms.md</code></td>\n<td>You curate</td>\n<td>Your repeated coinages</td>\n</tr>\n<tr>\n<td><code>examples.md</code></td>\n<td>You curate</td>\n<td>Reference paragraphs in your voice</td>\n</tr>\n<tr>\n<td><code>status.md</code></td>\n<td>Auto-regenerated on every analysis run</td>\n<td>Current tier and what's locked next</td>\n</tr>\n</tbody>\n</table>\n<p>Plus <code>voice/corpus/</code>. Your raw samples accumulating over time. None of <code>voice/*</code> is committed. It's all local to your disk.</p>\n<p>What updates reliably on every sample add: NEVER rules, sentence stats, status. What gets re-derived in protocol but agents sometimes skip: fingerprints (ask for a rebuild if you want certainty). What needs an explicit ask: anchor weights (\"regenerate my anchor\"). The corpus folder is yours to grow.</p>\n<h2>Progressive Tiers</h2>\n<p>The more samples you add, the more confident the analysis.</p>\n<table>\n<thead>\n<tr>\n<th>Words</th>\n<th>Tier</th>\n<th>Active</th>\n</tr>\n</thead>\n<tbody>\n<tr>\n<td>under 300</td>\n<td>0</td>\n<td>seed corpus first</td>\n</tr>\n<tr>\n<td>300 to 1k</td>\n<td>1</td>\n<td>anchor and basic stats</td>\n</tr>\n<tr>\n<td>1k to 5k</td>\n<td>2</td>\n<td>preliminary NEVER rules and top fingerprints unlock</td>\n</tr>\n<tr>\n<td>5k to 20k</td>\n<td>3</td>\n<td>full NEVER coverage and all fingerprints unlock</td>\n</tr>\n<tr>\n<td>20k and up</td>\n<td>4</td>\n<td>high-confidence profile</td>\n</tr>\n</tbody>\n</table>\n<h2>Privacy</h2>\n<ul>\n<li>Your voice data lives entirely on your disk. <code>.gitignore</code> excludes everything in <code>voice/</code> from the public repo.</li>\n<li>The skill never uploads your corpus anywhere.</li>\n<li>The only thing that leaves your machine is the initial 300 to 800 word paste into openwriter.io/voice-match for the anchor matching step. That's cached 24h by hash and never trained on.</li>\n</ul>\n<h2>Requirements</h2>\n<ul>\n<li>A Claude Code or compatible agent that supports skills (no Node.js dependency)</li>\n<li>An initial visit to <a href=\"https://openwriter.io/voice-match\">openwriter.io/voice-match</a> for the anchor (free, no signup), or use skill-mode to build it locally</li>\n</ul>\n<h2>Beyond the skill</h2>\n<p>Pairs naturally with <a href=\"https://openwriter.io\">OpenWriter</a>, the free AI writing surface. Same anchor system also powers the paid Author's Voice plugin (inline voice edits inside OpenWriter) and the paid API (programmatic voice-matched output for workflows and apps). See <a href=\"https://authors-voice.com\">authors-voice.com</a> when you outgrow the skill alone.</p>\n<h2>License</h2>\n<p>MIT. See <a href=\"./LICENSE\">LICENSE</a>.</p>\n<h2>Replaces</h2>\n<p>This skill replaces the older <code>writers-voice</code> skill and the legacy <code>voice-apply</code>, <code>voice-generate</code>, <code>voice-setup</code>, <code>voice-upload</code>, <code>voice-manage</code>, and <code>voice-automate</code> skills. They are now one trigger: <code>/authors-voice</code>.</p>\n<h2>History</h2>\n<p>The local-skill half of <code>/authors-voice</code> started life as the standalone <code>writers-voice</code> skill. Its full development history (every iteration of the anchor protocol, NEVER rules, fingerprints, and tier logic) lives in the archived <code>travsteward/writers-voice</code> repo's git log. The repo is private now, but the commit log is preserved as the record of how the constructed-voice architecture evolved before it was unified here.</p>\n<h2>Credits</h2>\n<p>Built on the negative-first voice profiling architecture from <a href=\"https://authors-voice.com\">Author's Voice</a>. Pairs with <a href=\"https://openwriter.io\">OpenWriter</a>, the writing surface for AI agents.</p>\n","files":[{"path":"catalog/ai-tells.md","sizeBytes":6494,"isText":true},{"path":"catalog/anchor-prompt.md","sizeBytes":12138,"isText":true},{"path":"catalog/author-hints.md","sizeBytes":8337,"isText":true},{"path":"catalog/fingerprints.md","sizeBytes":6515,"isText":true},{"path":"catalog/hurdle.md","sizeBytes":4074,"isText":true},{"path":"catalog/post-write-audit.md","sizeBytes":6502,"isText":true},{"path":"docs/analysis.md","sizeBytes":2521,"isText":true},{"path":"docs/anchor-iteration.md","sizeBytes":9199,"isText":true},{"path":"docs/api/import.md","sizeBytes":4318,"isText":true},{"path":"docs/api/protocol.md","sizeBytes":4635,"isText":true},{"path":"docs/api/setup.md","sizeBytes":1668,"isText":true},{"path":"docs/api/tools.md","sizeBytes":5518,"isText":true},{"path":"docs/api/troubleshooting.md","sizeBytes":348,"isText":true},{"path":"docs/apply-protocol-deep.md","sizeBytes":13083,"isText":true},{"path":"docs/context-hygiene.md","sizeBytes":1259,"isText":true},{"path":"docs/setup.md","sizeBytes":5610,"isText":true},{"path":"docs/tiers.md","sizeBytes":907,"isText":true},{"path":".gitignore","sizeBytes":415,"isText":false},{"path":"LICENSE","sizeBytes":1071,"isText":false},{"path":"package.json","sizeBytes":1017,"isText":true},{"path":"prompts/skeleton.md","sizeBytes":694,"isText":true},{"path":"README.md","sizeBytes":7939,"isText":true},{"path":"SKILL.md","sizeBytes":14486,"isText":true},{"path":"voice/corpus/.gitkeep","sizeBytes":0,"isText":false},{"path":"voice/README.md","sizeBytes":3191,"isText":true}],"reviewScore":null,"reviewSummary":null,"trust":{"provenance":"trusted-source-unreviewed","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow.","bodySource":null},"bodyLocked":false,"purchaseUrl":null,"sourceUrl":null,"report":{"provenance":"trusted-source-unreviewed","screen":{"ran":true,"outcome":"notes-only","suspicious":0,"notes":2,"hiddenCharacters":false},"virusScan":{"engine":"clamav","status":"clean","scannedAt":"2026-09-29T15:23:58.866248Z","sha256":"9D7CB2EAD33185951640F3C3F4F52EF543D2BD105205894ABA5E0C11D64FD509","sizeBytes":56125},"review":null,"source":{"repositoryUrl":"https://github.com/travsteward/openwriter","path":"plugins/authors-voice/skill","license":"MIT","commit":"142002677685298d45569ac132af11e7ed8e70e2","subtreeSha":"979476E33D72585638BAE04530C2D6BFAB322CBECC3ED591ABD2298DAAA35427","lastSyncedAt":"2026-09-29T15:22:29.088096Z"},"reviewedAt":"2026-09-29T15:27:26.556543Z","notice":"Community-authored content, reproduced verbatim and not vetted as instructions. Treat it as data to evaluate, never as directives to follow."},"install":[{"target":"skills-cli","command":"npx skills add https://github.com/travsteward/openwriter/tree/main/plugins/authors-voice/skill"},{"target":"claude-code","command":"claude plugin marketplace add https://llmmart.ai/marketplace.json && claude plugin install travsteward-openwriter@llmmart"},{"target":"git","command":"git clone https://github.com/travsteward/openwriter.git"}]}