skills/tone-of-voice/SKILL.md
Writes messages, emails, posts, comments, and tickets in the user's own tone of voice, with per-platform voice profiles for Slack, email, WhatsApp, LinkedIn, and Linear built from the user's real message and ticket history, plus a strategy layer (asks, declines, delicate framing, bad news) for messages that need to land. Routes to the right register and enforces an anti-AI-tells self-check. Ships a fictional demo persona so it works out of the box; the user swaps in their own voice files. Use when asked to "write this in my voice", "draft a Slack message", "reply to this email as me", "write a LinkedIn post", "send a WhatsApp message", "write a Linear ticket", "turn this into Linear issues", "make this sound like me", "ghostwrite this", "critique my draft", "will this land", or "help me say no to this". For marketing or product copy in a brand voice, use copywriting; for long-form articles and essays, use blog-post.
npx skillsauth add mblode/agent-skills tone-of-voiceInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Draft outgoing communication that is indistinguishable from what you would actually write. Each platform has a voice file of rules and verbatim excerpts: yours once you add them, the bundled demo persona until you do. Always read the matching voice file before drafting; never draft from this file alone.
Default prompt for every draft: shorter, simpler, more natural. When two phrasings both fit, pick the one with fewer words, plainer vocabulary, and a more human cadence. This overrides any pull toward completeness or polish.
A draft that reads as already-tight usually isn't. Try halving the word count, then return the shortest version that keeps every fact, link, and the intent.
copywriting), long-form articles or essays (use blog-post), or editing the excerpts themselves (they are ground-truth data; see references/refreshing.md).Two layers, applied together: the voice layer (this file plus the platform references) makes it sound like you; the strategy layer (references/strategy.md) makes it land when the message has stakes. Voice always wins a conflict: a strategically perfect draft that no longer sounds like you is a failure.
Read ~/.config/tone-of-voice/<platform>.md if it exists; otherwise fall back to the bundled references/<platform>.md, a fictional demo persona ("Sam") that ships so the skill works on install. Your files live outside the repo and the managed install directory, so they survive upgrades and are never published. To build them, see references/refreshing.md.
Swapping in your voice files changes the persona slots (opener, laugh token, sign-off, spelling, fingerprint words), not the rules. The anti-AI-tells list, the default toward shorter and plainer, and the strategy layer are the opinionated core and apply to every voice it writes in. If a draft is in your voice but full of tells, it failed.
Pick from the request; when ambiguous, default to draft (no existing text) or rewrite (existing text supplied).
Opinionated defaults, not a menu. Most of what follows is not taste, it is what stops a draft reading as AI, and it holds whoever you are: the point first, concrete specifics over abstraction, warmth carried by punctuation rather than length, no em dashes, and a real take. Keep those. Only the persona slots are yours to swap once you add your voice files: the opener, the laugh token, the sign-off, the spelling convention, and the fingerprint words.
These are the AI tells that most often leak into a draft. Strip them before anything else:
Frontier-model tells (still common in Claude 4.8 and GPT-5.x, strip on sight):
?utm_source=chatgpt.com / utm_source=claude.ai and similar before sending.Drafting tells (what a blind judge actually catches): these are what separated real messages from drafts in a head-to-head test, not word choice.
’; every model types ASCII '. Measured on one real corpus: the phone-typed surfaces ran 85% curly on WhatsApp, 72% on email, and 70% on LinkedIn, while desktop-typed Slack ran 75% straight, and AI drafts were curly 0 times out of 10. So a message that would have been thumbed out on a phone but carries ASCII apostrophes throughout is mechanically identifiable, no matter how well the words land. Match the punctuation of the device the platform is actually typed on; the platform voice file records which.~/.config/tone-of-voice/<platform>.md if it exists, otherwise the bundled references/<platform>.md (the demo persona). If the message's intent appears in the intent table below, also read references/strategy.md and pick the 2-3 principles it maps to.Never invent facts: no made-up numbers, availability, venue details, or people. Use only what the user supplied; leave a [placeholder] or ask for anything load-bearing that is missing.
| Intent | Apply from references/strategy.md |
|---|---|
| Making an ask (review, approval, favour) | The easy yes, most obvious objection, lead with the point |
| Declining or saying no | The warm no, receipts before you credit |
| Bad news, incident, or unpopular decision | Objective not detached, lead with the point |
| Feedback, praise, congrats, recommendation | Receipts before you credit, invert the but |
| Sharing a win | Lead with the point (the number first), receipts |
| Answering a delicate or loaded question | Finesse, answer the real question |
| Instructions, availability, boundaries | Speak in the affirmative |
| Status update | Lead with the point, answer the real question |
Strictness: apply the strategy layer fully to anything external, upward, an ask, a decline, or bad news. Apply it lightly to peer Slack and builder WhatsApp (cut obvious bloat, keep the warmth loose). Skip it for family WhatsApp logistics and DM banter: don't BLUF your mum.
Strip greetings-by-committee, hedges, em dashes, and filler, then re-shape to the platform norms (see the rewrite bullet in Modes for the rules). Example (Slack):
Before: Hi team, just wanted to flag that I've wrapped up testing on the new escalation flow. Everything looks great overall! There was one small issue (a dark-mode styling bug) which I've logged as APP-412. Let me know if you have any questions!
After: I ran through the new escalation flow and everything was working well. Only issue was a dark mode styling bug: APP-412
| Context | Register | Length | Emoji | Read file |
|---|---|---|---|---|
| Slack channel | Informative, complete sentences, numbers, links | 1-3 sentences | ~1 in 4 messages | references/slack.md |
| Slack DM | Rapid logistics, "Haha", quick answers | 1 line, often bursts | Sparse (😊 😮) | references/slack.md |
| Email reply | "Hey [First]," + 1-3 short paragraphs + "Thanks, [First]" | Shorter than the inbound | 0-1 (😊 👍) | references/email.md |
| Email cold/intro | Same shape, one line of context, clear ask, booking link | 2-4 short paragraphs | 0-1 | references/email.md |
| WhatsApp family | Plain, warm, logistics and jokes, zero work-speak | A few words to 1 line | Rare; "!!" instead | references/whatsapp.md |
| WhatsApp friends/builders | Like Slack DM but looser; big reactions in CAPS | 1 line, bursts | Occasional 😅 🙏 🎉 | references/whatsapp.md |
| LinkedIn post | Hook, specifics with numbers, distilled lesson, light CTA, tagged names | 3-8 short lines, blank line between each | 1-2 per post, required | references/linkedin.md |
| LinkedIn DM | Warm, exclamatory, fast; intros and meetup follow-ups | 1-3 sentences | Occasional 💪 😊 | references/linkedin.md |
| LinkedIn comment | Hype + gratitude, doubles ("Congrats!!"), one emoji | 1-2 sentences | Usually 1 | references/linkedin.md |
| Linear ticket | Gap, action, status tag; evidence-first for bugs | Title + 1-3 sentences | None | references/linear.md |
The "Read file" column names the bundled demo; your own ~/.config/tone-of-voice/<platform>.md overrides it when present (see Workflow step 2).
The biggest cross-platform shift: the chat voice is far terser and flatter than the LinkedIn feed voice. LinkedIn posts are energetic and structured; Slack and WhatsApp are quick, plain, and functional with warmth in the punctuation. Do not transplant LinkedIn energy into Slack, and do not write a LinkedIn post as flatly as a Slack message. Email sits in between: friendly but transactional, always signed "Thanks, [First]". Linear tickets are the flattest register of all: no emoji, no exclamation marks, just enough detail to be actionable by a human or agent picking it up cold.
| File | Read When |
|------|-----------|
| <platform>.md (from ~/.config/tone-of-voice/, else bundled references/) | Drafting for that platform: slack (channel, DM, status, review request), email (reply, intro, scheduling, support), whatsapp (family, friends, builders), linkedin (post, DM, comment, intro), linear (task, bug, investigation, or doc-to-tickets) |
| references/strategy.md | The message is an ask, a no, bad news, feedback or praise, a delicate answer, or anything high-stakes or external (see intent routing) |
| references/refreshing.md | Building or re-deriving your voice profiles from your own message history (maintenance only, never at drafting time) |
Run on every draft before returning it:
Voice check:
- [ ] Zero em dashes and zero spaced hyphens ( - ) standing in for them (automatic fail if any)
- [ ] Every number, name, date, and link came from the user or the thread; nothing invented (automatic fail if any)
- [ ] Rewrite mode only: every fact and link from the original survives
- [ ] No flat, wistful, over-balanced sentences; no tacked-on verdict
- [ ] No asserting value without a concrete detail or number
- [ ] No corporate filler ("hope this finds you well", "circling back", "per my last")
- [ ] No banned words (delve, leverage, robust, seamless, pivotal, unlock, empower, facilitate, cutting-edge) or crutches ("moreover", "that said", "let's dive in")
- [ ] No hedges or hollow intensifiers ("it's worth noting", "to be clear", "genuinely", "to be honest")
- [ ] No "it's not X, it's Y" antithesis; no vague endorsement ("worth a look"); no sycophantic opener ("great question")
- [ ] No frontier-model tells: copula avoidance ("serves as"), list-label periods ("**Label.**"), engagement hooks ("Here's the thing"), self-labeling significance, emotional flatline ("what struck me was"), endorsement closers ("must-read"), rhetorical-question openers, stacked hedges
- [ ] No prompt echo: the draft does not reuse the request's phrasing back at the reader
- [ ] Not over-smoothed: reads as typed, not copy-edited (the natural roughness of the voice files survives)
- [ ] Every concrete detail the user supplied is used, not swapped for a profile default
- [ ] No [Name] slots left where a real name belongs; not an excerpt with the nouns swapped
- [ ] Default mode held: shorter, simpler, more natural than the first draft
- [ ] Emoji count matches the platform norm (a LinkedIn post with zero emoji = not you)
- [ ] Length matches the context norm; shorter beats longer
- [ ] Named credit given where due
- [ ] Laugh is "haha", confirmations are "Perfect,"/"Easy,", enthusiasm uses "!!"
- [ ] Spelling matches your convention (the demo persona uses Australian English)
- [ ] Reads like the excerpts in the reference file, not like a press release
Strategy check (skip for family WhatsApp and DM banter):
- [ ] Point or ask in the first sentence (relaxed contexts: by sentence two)
- [ ] Any ask has a clear next action and concrete time; no "ASAP", "soon", "when you get a chance"
- [ ] Any pitch or recommendation names and answers its most obvious objection
- [ ] No performative praise labels; no announced honesty ("honestly", "one honest note")
- [ ] Every specific claim in a compliment or shout-out traces to the thread or user input
- [ ] Delicate or external drafts passed the negative-language audit ("don't", "issues", "usually", "should be fine")
~/.config/tone-of-voice/<platform>.md if present, else the bundled demo). Never call a live API, vault, or data lake at drafting time; the skill must work in agents whose only capability is reading these local files.~/.config/tone-of-voice/<platform>.md in this environment (a locked-down sandbox, or the file does not exist yet). Confirm the file exists and the path is readable, then redraft.blog-post.development
Fans out four concurrent review agents over the current diff, then APPLIES fixes directly to the working tree and verifies the build. Mutates code; it does not produce a report. Covers reuse (duplicate logic, hand-rolled stdlib, reinvented platform features), quality (hacky patterns, React/TypeScript hygiene, over-memoisation, exhaustive-deps, `any`, dead code, `CLAUDE.md`/`AGENTS.md` violations), efficiency (unnecessary work, missed concurrency, hot-path bloat), and test discipline (bug fixes without a repro test, useless tests to delete, missing tests only when they prevent a named failure). Use when the user says "tidy this up", "simplify", "clean up this diff", "polish my changes", "check for duplication", or "any reuse opportunities?", i.e. when the intent is to have the changes made automatically. For a read-only report that lists findings without touching files, use `pr-reviewer` instead. This skill edits code; for the PR's title, description, or commit history, use `pr-creator`.
development
Decides what an interface should do before UI is built or audited: interaction choice, action scope and consequence, reachable states, resilience, and accessibility as task completion. Works from a brief, spec, mockup, intent, or existing UI. Use when asked "is this the right interaction", "design the flow", "what control should this use", "what should this action affect", "which states should this have", "make this resilient", or "what breaks here". For building or styling use ui-design; for built-code audits use ui-audit; for copy wording use copywriting.
development
Builds and stress-tests implementation plans in two modes. Create mode scans code and docs, asks one question at a time with a recommended answer, runs a blindspot pass when the user is new to the area, then writes a plan file. Review mode scores completeness, feasibility, scope, testability, risk, and assumptions, verifies checkable claims, and writes resolutions back until every dimension reaches 5/5. Use when asked to "create a plan", "plan this feature", "I want to build X", "grill me", "think this through", "blindspot pass", "unknown unknowns", "this is new to me", "review my plan", "rubber duck this", "stress test this plan", "is this plan ready", "get this plan to 5/5", "what am I missing", "verify this claim", "prove this plan", "fact-check this plan", or when the user explicitly wants a plan artifact before implementation. For code review use pr-reviewer; for architecture briefs use define-architecture.
tools
Audits the smallest relevant developer-facing surface of a library, CLI, SDK, or npm package across API contracts, errors, CLI behavior, public types, onboarding, and config. Uses candidate-first rule loading, bounded local evidence, and compact root-cause findings. Use when asked to "audit my CLI", "make this CLI agent-friendly", "is this API ergonomic", "review the developer experience", "improve these errors", "simplify first run", or "review my SDK". For end-user UI use ui-audit, for agentic-app trust use ax-audit, for docs prose use docs-writing, for README work use readme-creator, and for repo architecture use define-architecture. Inside a product that also ships a UI, this is the skill for the developer-facing half, so pick it when the complaint is about an import, command, error string, exported type, or config rather than a screen.