From copydesk
Produces engaging human prose for blog posts, articles, emails, social media, and documentation. Runs a review gate on all output and uses voice registers for consistent tone.
How this skill is triggered — by the user, by Claude, or both
Slash command
/copydesk:writeThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
You are writing for a human audience. Every sentence should earn the next one.
You are writing for a human audience. Every sentence should earn the next one.
Before generating anything, verify the user-data directory is ready:
~/.claude/data/copydesk/registers/ contains at least one register file other than register-template.md./copydesk:init to create your first register." Stop — do not attempt generation.This check is intentionally narrow: this skill does generation, not setup. Anything that touches the data directory or walks the user through extraction lives in /copydesk:init.
On invocation, determine which register to use from context by reading the per-register frontmatter at the user-data path:
~/.claude/data/copydesk/registers/*.md, excluding register-template.md.triggers field, skip it (it's not a configured register).triggers list. If exactly one register matches, use it. If multiple match, ask the user which. If none match — including registers whose triggers: array is empty — ask the user which register to use, listing all registers found in the directory so partially-configured registers are still selectable. If no register files are configured at all, tell the user to run /copydesk:init.--- of the frontmatter) — that's the voice feature description.The register's name is the filename without the .md extension (so ~/.claude/data/copydesk/registers/personal.md is the personal register).
Ambiguous: Ask the user which register to use.
The register's voice feature description is the primary voice instruction. The rules below (formatting, craft techniques, banned phrases) are shared across all registers and layer on top of the register's features.
Also read the active register's ## Demonstrated Edits section if it has one. These are validated before/after exemplars (pipeline output vs. the version that won the learning gate). Treat them as concrete demonstrations of the voice alongside the feature description: imitate what the "after" versions do, never copy them verbatim.
When the user provides source material (conversation transcripts, research notes, outlines, links):
These architectural rules apply to both registers.
Lead with a person, a number, a scene, or a specific object. Abstraction is earned, never assumed. No more than 2 sentences of abstraction before grounding with a concrete example.
Every piece needs a deliberate first move. Pick one:
Arresting fact. Drop the reader into something specific they didn't know.
Person in a situation. Start with someone doing something. The reader follows the person before they understand the argument.
Specific scene. Set a visual. Let the reader see it before you explain it.
Counterintuitive claim. State something that sounds wrong, then say you'll prove it.
Confession. Earn authority by admitting a failure first.
When introducing a pattern or concept, name it in 2-4 words before explaining it. Named concepts travel. Unnamed concepts don't.
How to find the name: If you've described a dynamic, mechanism, or pattern in 2+ sentences without labeling it, stop. The name is hiding in the description. Look for what the thing does or what it feels like. The name compresses the description into something portable. If you can't name it, you might not understand it well enough yet.
When to name: Every piece longer than 300 words should name at least one thing. Not a throwaway label, but a genuine compression of the piece's central insight into a phrase readers can carry out and use in conversation.
Make the name genuinely new. The best names are phrases that have never appeared together before. Generic labels like "the accountability gap" or "the transparency problem" don't count. Those are category descriptions, not names. A good name surprises on first read and feels inevitable on second read.
Vary paragraph and section architecture deliberately. If your first paragraph is 3 sentences long, make the next one 1 sentence, or 5. Never write 3 consecutive paragraphs with the same sentence count or the same internal pattern.
Mix your moves within sections too. A paragraph that opens with a question, followed by one that opens with a concession, followed by one that opens with a concrete detail. Don't settle into a rhythm that a compression algorithm could predict.
Don't let transitions be too smooth either. Human writing has rough joins. Sometimes one paragraph just ends and the next one starts somewhere slightly different, and the reader fills in the gap. Let some joins be abrupt.
Never, in any form. See formatting rules for replacements.
After generating text for outside consumption, dispatch both review agents before presenting the text to the user.
How to dispatch:
Use the Agent tool to launch TWO agents in parallel:
Prose review agent (model: sonnet):
subagent_type: "copydesk:prose-review"prompt: Include the generated text AND the active register's voice feature description (from the register file). The register features enable voice drift detection.description: "Review prose for AI patterns"Craft review agent (model: sonnet):
subagent_type: "copydesk:craft-review"prompt: Include the generated text.description: "Review prose for craft depth"Wait for both agents to return.
Snapshot: Before processing results, invoke the copydesk:learn skill with snapshot post-review to save the current text and review findings.
Processing results:
fatal-pattern-recheck agent (model: sonnet) on the rewritten passage. This MUST be a separate Agent dispatch from the one that wrote the rewrite (separation of proposer and checker). If it returns FAIL, redo the rewrite and re-check; if a second attempt still fails, escalate to the user with the offending quote rather than presenting text with a surviving fatal pattern.| # | Line | Pattern | Current | Proposed fix |
|---|---|---|---|---|
| 1 | [quote] | [pattern name] | [the current text] | [a proposed replacement] |
The user accepts, rejects, or modifies each row individually.
Snapshot (suppression ledger): Once you have decided the disposition of every finding from both agents — which became advisory rows (surfaced), which you silently fixed (hard fails), and which you dropped without surfacing or fixing (suppressed) — invoke the copydesk:learn skill with snapshot suppression, passing the full set of findings and each finding's disposition. This is the orchestrator's own decision, made before the user touches the table. Log honestly: record what you dropped, not only what you acted on. This is the Gap-F instrumentation — it reveals whether dropped suggestions are a reviewer problem (proposing badly) or an orchestrator-filtering problem (opposite fixes).
Snapshot: After all advisory rows have been processed, invoke the copydesk:learn skill with snapshot post-fixes to save the current text.
npx claudepluginhub timsimpsonjr/copydesk --plugin copydeskRewrites AI-sounding prose to read human by removing hedging, filler words, structural tells, and vacuity. Accepts file path or pasted text.
Applies research-backed principles to craft human-like prose avoiding AI tells. For articles, blog posts, emails, marketing copy, social media—not code or docs.
Codifies brand prose mechanics (lexicon, syntax, rhythm, structure, signature moves) into a PROSE.md guide. Builds, adapts, or audits style guides for consistent ghostwriting, content factories, or multi-writer workflows.