Skip to content
Development
Skill

/sota-ux-writing

State-of-the-art UX writing and product-copy guidance (2026) covering voice and tone systems, plain language (ISO 24495-1), microcopy (buttons, labels, empty states, onboarding, notifications), error and feedback message craft, and the accessibility and localization of interface

From plugin
sota-skills
2843 skills5 commands4 hooks2 MCP

Claude Code

$ npx -y skills add martinholovsky/SOTA-skills --skill sota-ux-writing --agent claude-code

SKILL.md

sota-ux-writing.SKILL.md
name: sota-ux-writing
description: >-
  State-of-the-art UX writing and product-copy guidance (2026) covering voice
  and tone systems, plain language (ISO 24495-1), microcopy (buttons, labels,
  empty states, onboarding, notifications), error and feedback message craft,
  and the accessibility and localization of interface language (WCAG 2.2
  language criteria, alt text, ICU pluralization, i18n-safe strings). Use when
  writing or reviewing ANY user-facing interface text — web, mobile, desktop,
  or CLI products — AND when auditing existing product copy for clarity,
  consistency, tone, accessibility, and localization readiness. Trigger
  keywords: UX writing, microcopy, product copy, content design, error message,
  empty state, button label, tooltip, onboarding copy, form label, placeholder,
  notification, toast, confirmation dialog, tone of voice, terminology, plain
  language, readability, alt text, i18n strings, localization, translation.

SOTA UX Writing & Product Copy

Purpose

Expert-level rules for the *words inside the product*: labels, buttons, errors, empty states, onboarding, notifications, and every other string a user reads while trying to get something done. The core thesis: **interface text is functional infrastructure, not decoration — a user reads it under task pressure, often in a second language, often through a screen reader, and every word either moves them forward or costs them a support ticket.**

Boundaries: this skill owns the *language*. The UX *patterns* the language lives in (when to show an empty state, validation timing, dialog escalation) are [`sota-frontend-design` rules/04](../sota-frontend-design/rules/04-ux-patterns.md); technical documentation is [`sota-docs-workflow`](../sota-docs-workflow/SKILL.md); outward-facing marketing content is [`sota-copywriting`](../sota-copywriting/SKILL.md); CLI-specific output contracts are [`sota-cli-ux`](../sota-cli-ux/SKILL.md).

BUILD mode

When writing or changing interface text:

1. **Write the unhappy paths first** — errors, empty states, and confirmations carry more consequence than the happy path ([`rules/03`](rules/03-errors-feedback.md)). 2. **Apply the plain-language spine** to every string: relevant, findable, understandable, usable (ISO 24495-1) — front-load the point, one idea per sentence, common words ([`rules/01`](rules/01-voice-tone-plain-language.md)). 3. **Name things once.** Check the product glossary before introducing a term; never let the UI, docs, and API call the same concept different names ([`rules/01`](rules/01-voice-tone-plain-language.md) §4). 4. **Buttons are verbs with objects** ("Delete project", never "OK"/"Yes"), and every dialog states the specific consequence ([`rules/02`](rules/02-microcopy-components.md)). 5. **Write for the translator and the screen reader as you go**: externalized strings, ICU plurals, named placeholders, descriptive link text, accessible names matching visible labels ([`rules/04`](rules/04-accessibility-localization.md)). 6. Before finishing, run each loaded rules file's **Audit checklist** against the diff — including the greps for banned strings.

AUDIT mode

**Coverage:** every `rules/` file's Audit checklist applies in AUDIT mode. Mark one *not applicable* only with its reason in the report — never skip a file because the thing it checks for is absent, since that absence may be the finding.

When reviewing existing product copy:

1. Inventory the string surface: localization files (`*.json`, `*.po`, `*.strings`, `*.xlf`), hardcoded literals in components, error-message constants, email/notification templates. 2. Run the banned-pattern greps from each rules file's audit checklist (e.g. `"click here"`, `"an error occurred"`, `"invalid input"`, concatenated plurals). 3. Walk the critical flows as a user: signup, first-run empty state, a failed payment/submit, a destructive action. Judge every string against [`rules/01`](rules/01-voice-tone-plain-language.md)–`03`. 4. Check localization readiness ([`rules/04`](rules/04-accessibility-localization.md)) even for single-language products — retrofitting string externalization is expensive.

Severity conventions

  • **Critical** — copy that causes data loss or deception: destructive-action

dialog whose buttons don't name the action; error message leaking secrets, internals, or account existence; consent text that misrepresents what happens; dark-pattern confirmshaming.

  • **High** — copy that blocks task completion or excludes users: error with no

next step; placeholder used as the only label; icon-only control with no accessible name; untranslatable concatenated strings; link text meaningless out of context ("click here").

  • **Medium** — friction and inconsistency: same concept under two names;

jargon or internal codenames in UI; blame-framed errors; toasts carrying the only path to an action; missing empty-state guidance.

  • **Low** — polish: tone drift, capitalization inconsistency, "please"

inflation, exclamation marks, filler words ("simply", "just").

Finding format

`file:line | rule violated | severity | effort | fix` — quote the current string and propose the exact replacement string; copy findings without a proposed rewrite are half-findings.

Rules index

| File | Read this when... | |---|---| | [`rules/01-voice-tone-plain-language.md`](rules/01-voice-tone-plain-language.md) | Establishing or auditing the overall language system: voice vs tone, stress-aware tone shifts, plain-language rules (ISO 24495-1), readability, terminology/glossary discipline, capitalization and punctuation conventions. | | [`rules/02-microcopy-components.md`](rules/02-microcopy-components.md) | Writing the words in components: buttons/CTAs, labels vs placeholders vs hints, empty states, onboarding and tooltips, confirmation dialogs, notifications/toasts/badges, counts and plurals, relative time, link text, loading/progress text. | | [`r

Read more
@martinholovsky
Ships withsota-skills

Make your AI coding assistant build and audit like your most senior engineer. Your assistant is brilliant — it just doesn't know your standards, and it forgets the ones it does know as the task grows long.

2843 skills2 MCP
Get the whole plugin

Stars on GitHub

Momentum

stars in total
28
Star history of martinholovsky/SOTA-skills on GitHub, a chart by star-history.com

Other skills on sota-skills.

sota-c-cpp

sota-c-cpp

State-of-the-art C and C++ engineering rules that Claude applies when writing or auditing C/C++. Covers modern idioms (RAII,…

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills2w309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react5d252k
@facebook@facebookInstall Skill

Questions about sota-ux-writing.

Which coding agents can use sota-ux-writing?
sota-ux-writing installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.