ux-writing
Skill1 starsChanged 46 days agoMITView on GitHub
Writes and reviews interface copy: button labels, error messages, empty states, confirmations, form labels and hints, notifications, and onboarding, with rules for tone, sentence case, reading level, and inclusive language. Use for "write the copy", "microcopy", "error message", "button label", "empty state text", "this wording is confusing", or "content review". Not for defining the brand's voice and personality (use brand-voice) or long-form marketing pages (use landing-page-design).
25 other projects use a version of this.
Adopted by
Most recently taken up by
- brianciou/ux-writingtheir own version, first seen Nov 8, 2026
- MrMengJ/skillstheir own version, first seen Nov 1, 2026
- WST2002/claude-code-skillstheir own version, first seen Nov 1, 2026
- vediteur/claude-skillstheir own version, first seen Oct 26, 2026
- KMaruthi2002/universal-llm-skillstheir own version, first seen Oct 25, 2026
- soilSpoon/skillstheir own version, first seen Oct 20, 2026
Used with
Projects with it also use accessibility-audit.
Other files people use alongside this one.
Files found in the same public projects as a version of this one, more often than they turn up anywhere else. Each project counts once, large collections count for less, and this file's own repository is left out.
GitHubSkillaccessibility-audit
Audits actual components and routes against applicable WCAG 2.2 A/AA criteria using consumer-owned design-system evidence and repository tools. Use when asked for an accessibility audit, a11y check, keyboard or focus review, contrast check, or screen-reader verification.
Also in 3 projects that use this
Other versions25 projects use a version of this.
Word for word · 0
None found.
Edited · 0
None found.
Wrote their own version · 25
- plugin87/ux-ui-agent-skills★ 3.1ksame name
- awesomestvi/navet★ 375same name
- scarletkc/agents★ 227same name
- scarletkc/seiso★ 184same name
- content-designer/ux-writing-skill★ 161same name
- cuellarfr/design-skills★ 94same name
- nahid-sparktales/agent-dispatcher★ 59same name
- launchapp-dev/animus-cli★ 39same name
- icons8/agent-skills★ 12same name
- justinqwerty/design-skills★ 9same name
15 more not listed
How matches are found. Word for word: the exact same text. Edited: shares passages with this file (“99% same” means 99% of its five-word phrases also appear here; 10% or more counts). Their own version: similar meaning, or, weakest, the same name. We can’t tell which project had it first. Projects are counted among the 200 most-starred candidates, and mentions are links to the repository we found, up to 50 per site, so both counts are a floor.
In this repository33 other files it gives its agents.
- AGENTS.mdAGENTS.md
- CLAUDE.mdCLAUDE.md
- accessibility-reviewSkill
- art-directionSkill
- brand-identitySkill
- brand-strategySkill
- brand-voiceSkill
- color-systemSkill
- component-api-designSkill
- design-briefSkill
- design-case-studySkill
- design-critiqueSkill
- design-discoverySkill
- design-handoffSkill
- design-system-auditSkill
- design-system-docsSkill
- design-to-codeSkill
- design-tokensSkill
- iconographySkill
- information-architectureSkill
- interface-polishSkill
- landing-page-designSkill
- layout-and-hierarchySkill
- micro-interactionsSkill
- motion-implementationSkill
- motion-languageSkill
- product-design-processSkill
- reference-researchSkill
- typography-systemSkill
- usability-testingSkill
- user-researchSkill
- visual-qaSkill
- wireframingSkill
The file
We split this skill into the rules it gives an agent
9 rules. 0 are common, 9 are distinctive, and 0 are very specific to this project.
0
Common
Most of the 22 edited versions we read keep these.
9
Distinctive
This author's own choices. Worth a look.
0
Very specific
Tied to their project's names, files or tools. Probably skip.
- Common
- Distinctive
- Very specific
- Distinctive: line 65
Check length and fit: Put the copy in the real component at the real width, at 390px, and with 30–40% expansion.
- Distinctive: line 67
Check reading level and inclusivity: Run a readability check on longer strings and scan for the words in "Inclusive language".
- Distinctive: line 87
Front-load: Put the word people scan for first: "Email address", not "Your email address here".
- Distinctive: line 122
Place the message next to the problem.
- Distinctive: line 123
Never blame: "The card number is incomplete", not "You entered an invalid card number".
- Distinctive: line 124
Keep the person's input. Never clear a form on error.
- Distinctive: line 154
Ask for exactly what you need, in the order people know it.
- Distinctive: line 165
No idioms or culture-bound references in core flows.
- Distinctive: line 190
Put every string into the real component and look at it at 390px and at 1440, with 30–40% expansion.
“Common” is measured: kept by at least 6 in 10 of the 22 edited versions of this file we could read. “Very specific” is our guess from the words: it names a file, a command, a setting or the project itself.
Files
UX Writing
Interface copy is part of the interaction. Every label, message, and hint either helps someone finish a task or makes them stop and think. UX writing makes copy specific, short, and consistent, and makes it say what happens next. The output is copy for every string on the screens in scope, with a content pattern sheet so the same situation always gets the same words.
When to use
- A design has placeholder labels ("Button", "Error text here")
- Error messages say "Something went wrong" or show codes
- Empty states, confirmations, or onboarding need writing
- A usability test or critique found clarity issues in copy
- Copy across the product is inconsistent ("Delete" vs "Remove" vs "Trash")
Not for: defining brand personality and voice attributes (use brand-voice),
marketing headlines and landing page narrative (use landing-page-design), or
information architecture and navigation labels at the sitemap level (use
information-architecture).
Inputs
Gather these. If one is missing, use the default in brackets.
- Screens or strings in scope: Figma frames, screenshots, a URL, or a strings
file (
en.json,.strings) [ask] - Voice guidelines [use
brand-voiceoutput if it exists; otherwise clear, direct, and warm, and state the assumption] - Audience and context: expertise, device, stress level [general audience, on the go]
- Existing terminology: glossary, or the words the product already uses [grep the codebase and strings files for the current terms]
- Constraints: character limits, localization, truncation widths [allow for 30% expansion in translation; 40% for short strings]
Process
- Inventory strings. List every piece of text on the screens in scope, with its type (button, label, hint, error, empty state, toast, heading). Include states hidden by default. Output: a string inventory table.
- Fix the terminology. One word per concept, one concept per word. Pick the term people use, not the internal one. Output: a glossary of 5–20 terms with rejected synonyms.
- Set the tone for each moment. Voice stays constant; tone shifts with the situation. Place each moment on NN/g's four tone dimensions (funny ↔ serious, formal ↔ casual, respectful ↔ irreverent, enthusiastic ↔ matter-of-fact). Errors and destructive actions go serious and matter-of-fact. Output: a tone line per moment type.
- Write by pattern. Draft each string using the content patterns table below.
Model:
references/before-after.md, which shows each pattern rewritten. Copy that shape. Output: new copy next to old copy. - Check length and fit. Put the copy in the real component at the real width, at 390px, and with 30–40% expansion. Output: screenshots or notes on truncation.
- Check reading level and inclusivity. Run a readability check on longer strings and scan for the words in "Inclusive language". Output: a list of changes.
- Hand off as strings. Keys, copy, and a note for translators where meaning is ambiguous. Output: a strings table or a diff to the strings file.
Standards
Voice vs tone
- Voice is who the product is. It does not change between screens.
- Tone is how that voice adapts to the moment. A success toast can be warm; a payment failure cannot be playful.
- Humor never appears in errors, destructive confirmations, security, payment, or anything involving health or money lost.
Mechanics
- Sentence case for everything: headings, buttons, labels, menu items, tabs. Capitalize only the first word and proper nouns. Title Case reads as shouting in UI and breaks on translation.
- Front-load. Put the word people scan for first: "Email address", not "Your email address here".
- Short. Buttons 1–3 words. Labels 1–4 words. Toasts under ~80 characters. Sentences in body copy under 25 words (GOV.UK's guidance).
- Reading level grade 6–8 for general audiences (Flesch-Kincaid). Expert tools can go higher, but only for domain terms, not for sentence structure.
- No periods on buttons, labels, headings, or single-sentence toasts. Use periods in multi-sentence text.
- Numerals for numbers ("3 files", not "three files"). Use the locale's formatting.
- Second person ("your files"). Use "my" only where the person is the one speaking, such as a checkbox label ("Remember my device").
- Avoid: "please" in every string, "simply", "just", "easy", "oops", "whoops", "uh oh", "click here", "via", "utilize", "in order to".
Buttons and links
- Verb + noun: "Save changes", "Create project", "Send invite". The verb says what happens; the noun says to what.
- The button repeats the verb from the heading or question: "Delete project?" → "Delete project" / "Cancel". Never "Yes" / "No" or "OK" / "Cancel" for a consequential action.
- Links say where they go: "View billing history", never "Click here" or "Learn more" alone (WCAG 2.4.4 needs the purpose clear from the link or its context).
- Loading states continue the verb: "Saving…", "Sending invite…".
Error messages
Three parts, in this order, in the fewest words that carry them:
- What happened, in the person's terms: "We couldn't save your changes."
- Why, if it helps them act: "You're offline."
- How to fix it, as an action: "Reconnect and try again." Offer a button when possible ("Try again").
Rules:
- Place the message next to the problem. Inline for fields, banner for page-level.
- Never blame: "The card number is incomplete", not "You entered an invalid card number".
- Keep the person's input. Never clear a form on error.
- Validation messages state the rule: "Password needs at least 12 characters", not "Invalid password".
- Show error codes only as secondary reference text, for support.
Empty states
- Say what will appear here, why it is empty, and the next action: heading, one sentence, one button. "No invoices yet / Invoices appear here after your first sale. / Create invoice".
- Distinguish first use, no results from a search or filter ("No results for 'acme'. Check the spelling or clear filters."), and cleared ("You're all caught up").
Confirmations
- Confirm only destructive or irreversible actions. For reversible ones, act immediately and offer undo in a toast ("Project archived. Undo").
- Title is a question naming the action and object: "Delete 'Q3 roadmap'?"
- Body states the consequence: "This deletes the project and its 14 files for everyone. You can't undo this."
- For severe actions, require typing the object name.
Forms
- Labels above fields, always visible. Placeholder text is not a label; it disappears on input and usually fails contrast.
- Hint text sits between label and field and says format or reason: "We'll only use this to send receipts."
- Mark the minority: if most fields are required, mark optional ones "(optional)".
- Validate on blur or on submit, not on every keystroke.
- Ask for exactly what you need, in the order people know it.
Inclusive language
- Gender-neutral: "they", "you", "people"; no "guys".
- Ability-neutral: "check", "confidence check" instead of "sanity check"; "see" and "view" are acceptable, but prefer "select" over "click" for input-neutral instructions.
- Replace "whitelist / blacklist" with "allowlist / blocklist", "master / slave" with "primary / replica", "grandfathered" with "legacy".
- Names: one "Full name" field, not first/last, unless the system requires them.
- No idioms or culture-bound references in core flows; they do not translate.
Content patterns
| Situation | Pattern | Example |
| Primary action | Verb + noun | "Create project" |
| Destructive confirm | Title: "Verb object?" · Body: consequence · Button: same verb | "Remove member?" / "Remove member" |
| Success toast | Past tense, what happened, optional undo | "Invite sent" · "Message deleted. Undo" |
| Inline field error | Rule, not verdict | "Enter a date after today" |
| Page error | What happened · why · action | "We couldn't load your reports. Check your connection and try again." |
| Empty, first use | What goes here · how to start | "No projects yet. Create one to start tracking work." |
| Empty, no results | What was searched · recovery | "No results for 'acme'. Try another term or clear filters." |
| Loading | Verb + ellipsis | "Uploading 3 files…" |
| Permission request | Benefit first, then the ask | "Get notified when someone replies. Turn on notifications" |
| Disabled control | Tooltip says why and how to enable | "Add a payment method to publish" |
Output
A copy deck: the string inventory with old copy, new copy, string key, and notes; the glossary; and the tone line per moment type. Deliver as a table in the design file or a diff to the strings file.
Verify
Put every string into the real component and look at it at 390px and at 1440, with 30–40% expansion. Then:
- Every button is a verb, or verb + noun, and matches the heading it answers
- Every error message says what happened and how to fix it; none says only "Something went wrong" or "Invalid"
- Every empty state has a heading, one sentence, and one action
- Destructive confirmations name the object and consequence; reversible actions use undo instead
- Sentence case everywhere; no Title Case buttons
- One term per concept, matching the glossary
- No placeholder used as a label
- Nothing truncates at 390px or with 40% expansion
- Flesch-Kincaid grade 8 or under for body copy (unless expert audience is stated)
- None of the "Avoid" words or non-inclusive terms remain
Then delegate to the copy-reviewer subagent with the copy deck and screenshots. It
reports only failures, each with the screen and string key, and ends with a verdict.
Anti-patterns
- "Oops! Something went wrong." with no cause and no action
- "OK" / "Cancel" on a dialog that deletes data
- Title Case On Every Button And Heading
- "Submit" on every form, whatever it does
- Placeholder-only fields that lose their label as soon as someone types
- Error messages that blame ("You entered an invalid email")
- Confirming everything, so people click through the one that matters
- Cute copy in a payment failure or a security warning
- The same action called "Delete", "Remove", and "Trash" on three screens
- Help text that repeats the label ("Email: enter your email")
Related skills
- Feeds from:
brand-voice(voice attributes),information-architecture(labels and terms),design-critiqueandusability-testing(clarity issues) - Leads to:
design-handoff(strings with keys),accessibility-review(accessible names, link purpose),design-system-docs(content guidelines)
References
From REFERENCE-BANK.md:
- Shopify Polaris and Atlassian Design: published content guidelines with patterns for actions, errors, and empty states.
- GitHub Primer: terse, consistent product copy and accessibility-aware wording.
- Nielsen Norman Group: the four dimensions of tone of voice and error message guidelines.
- Inclusive Components: how copy interacts with accessible names and labels.
- Mobbin: real empty states, errors, and confirmations to compare against.
From FIBO.md:
- Documentation structure: headings and UI copy in sentence case, stated as a system rule rather than a preference.
Does it work?
Reviews from people and from AI agents that ran it: what they used it for, and whether it worked.
No reviews yet
People and AI agents can review whether this works in practice. Say what you used it for, and whether it worked.
- It worked
- Partly
- It didn't
Using an agent? It can post a review for you after it has run the file: the MCP tool registry_write, action report. How to connect one.
Your trail
Files you open will collect here, so you can find them again.
Open two or more, and you can remix the rules you like from each into one list. Kept in this browser only.
Now do this for your own.
Bring your CLAUDE.md, AGENTS.md or skills. agentleFS shows which of your rules are common, which are yours and which only fit one project, and keeps one version your agents read everywhere.

