Voice and microcopy
Skill eugenelim/agent-ready-repo/packs/product-engineering/.apm/skills/voice-and-microcopy
Use when shaping the actual words a user reads in a product's UI — characterizing the product's voice, writing the recurring UI-state microcopy (error, empty, button, label), or reviewing copy before it ships. Triggers on "what should this error say", "write the empty-state copy", "name this button", "characterize our product voice", "make this microcopy blame-free", "review this copy". Characterizes voice along a few axes, writes each UI state from a blame-free + actionable formula, and runs a content checklist. When a screen flow and per-screen state matrix are present (from `experience-design`'s `user-flow`), writes copy per screen × state keyed to the matrix; when absent, behaves as today. Do NOT use to frame the intent behind the feature (use `frame-intent`), to make visual or layout design decisions (this is words only), or to write documentation prose (that is `new-guide`'s clear-prose craft).From its SKILL.md
npx -y skills add eugenelim/agent-ready-repo --skill voice-and-microcopyAssembled from the repository path, not quoted from the project. Check it against their README if it does not work.
One thing to look at
- 15 stars15 stars. Stars are a popularity signal and not a quality one, but at this level it is likely that nobody has read this closely except its author, and you would be relying on your own review.
SKILL.md
6.8 KB, ~1.5k tokens by cl100k_base, as published. Nobody here has run it
Skill: voice-and-microcopy
Shape product intent into the words a user reads in the UI. The pack frames,
de-risks, and decomposes intent into shippable features; this skill writes the
copy those features render. The method is three moves: characterize the voice
along a few axes, write each UI state from a blame-free, actionable formula,
and run a content checklist before the copy ships. It is a method, not a word
bank — framework-agnostic, and it never mandates a schema. The voice axes are in
references/voice-axes.md, the per-state formulas in
references/microcopy-formulas.md, the checklist in references/content-checklist.md.
When a per-screen state matrix from experience-design's user-flow is
present, this skill writes copy per screen × state — one copy entry per
screen/state cell in the matrix — and keys every string to the matrix row. The
state set those cells enumerate is the experience-design pack's shared
quality-floor (empty / loading / error / success / partial / disabled, plus
permission/denied when gated); defer to it by-name for which states a screen
owes copy, rather than inventing a state list. When the matrix is absent the
skill is still fully useful: it writes copy for the states you name directly
(detect-and-degrade; no screen flow required).
Design-seat pairing. This skill is the content layer of the design seat; the design methods and screen-flow artifacts live in the
experience-designpack. See theexperience-designpack'suser-flowskill for the per-screen state matrix this skill can consume.
Scope boundary — surface type is the dividing line. For marketing/acquisition copy voice and positioned copy (hero headlines, above-fold narrative, taglines, announcement copy), use the
experience-designpack'stone-of-voiceskill;voice-and-microcopycovers product UI copy states (error, empty state, button labels, form labels). Onboarding tri-point: onboarding narrative arc and structure →content-design(experience-design pack); onboarding copy voice and register →tone-of-voice(experience-design pack); onboarding UI-state strings (loading, error, empty) →voice-and-microcopy(this skill).
When to invoke
Before writing, confirm:
- The ask is about the words users read, not the intent behind the feature
(route to
frame-intent) and not visual or layout design (out of scope — this skill shapes text only). - There is a real UI surface with copy to write or review — an error, an empty state, a button, a label, or a screen full of them. If there's no user-facing text yet, there's nothing to shape; say so.
Procedure
-
Characterize the voice — once per product, then reuse. Place the product on a few axes (humor, formality, respect, enthusiasm) and record it in a voice chart — copy
assets/voice-chart-template.mdtodocs/product/voice/<slug>.md. If a chart already exists, reuse it; don't re-derive. Voice is constant; tone flexes by context — the same product is calm and plain in an error, warmer in a success. Seereferences/voice-axes.md. A half-filled chart is normal input — offer a default, don't block. -
Write each UI state from its formula. Identify the state and apply its shape (
references/microcopy-formulas.md):- Error — what happened, plainly + what to do next. Blame-free: describe the situation, never fault the user ("That code has expired — request a new one", not "You entered an invalid code").
- Empty state — orient (what belongs here) + invite the first action. Never a decorative dead end.
- Button / CTA — verb + object matching the user's goal ("Send invite", not "Submit" / "OK").
- Label — concise, scannable, front-loaded keyword; one term per concept.
When a per-screen state matrix is present (produced by
user-flowin theexperience-designpack): write copy per screen × state. For each screen in the matrix, write one copy entry per applicable state (empty / loading / error / success / partial / disabled / permission-denied), applying the formula above. Key each entry to its matrix cell — screen name + state name — so the output maps directly back to the matrix. States that don't apply to a given screen are skipped; don't pad.When no matrix is present (standalone use): name the states yourself and write copy for each, as above. The skill is fully useful without a screen flow.
-
Run the content checklist before it ships (
references/content-checklist.md): voice-consistent, blame-free, actionable, concise, and terminology-consistent. Run it on any string before it lands; fix the misses.
Anti-patterns to refuse
- Blaming the user. "You entered the wrong password" faults the reader; "That password didn't match — try again or reset it" states the situation and the next step. Error copy is blame-free, full stop.
- Dead-end copy. An error or empty state that names the problem but not the next action strands the user. Every dead end gets a way forward.
- Cleverness over clarity. A joke that costs a beat of comprehension fails — voice serves the user, not the writer. Wit is welcome only when it doesn't slow the read.
- Ignoring emotional context. A playful product is still calm and plain when a payment fails. Voice is constant; tone flexes — don't joke in a crisis.
- Writing copy with no voice characterized. Without a chart, terminology and formality drift string to string. Characterize first, or reuse the chart.
- Mandating the chart as a schema. The voice chart is a prompt sheet; a half-filled one is fine. Blocking on empty fields is the failure mode.
- Restating the docs-prose craft. Clear-prose rules for documentation live
in
new-guide'sclear-prose.md; cross-reference shared items, don't fork them.