UX writing skill.

A free UX writing skill for your AI coding agent: headings, buttons, error messages, empty states and sample content, written plainly in Claude Code, Codex or Cursor so they do not sound generated.

Most AI-written interfaces share a voice: unlock, elevate, seamless, three adjectives in a row and an em dash in every sentence. This skill replaces that with plain, specific words that help someone understand or act, from the headline and buttons down to errors, empty states and the sample content that fills a new screen.

Skill
wensity-ui-copy
Plan
Free, no account needed
Loads when
Writing or revising any user-facing text in a UI
Works in
Claude Code, Codex, Cursor, GitHub Copilot, Windsurf, Gemini CLI, OpenCode
Format
Agent Skills (SKILL.md), plain files in your project

Install

Run this in your project. It finds the agents you use and puts the skill where each one looks for it.

terminal
pnpm dlx skills add wensity/skills --skill wensity-ui-copy
wensity/skills

Open source under MIT, with the other free skills. A star helps other developers find them.

Star on GitHub

Or add it by hand: save the file as SKILL.md in a folder named wensity-ui-copy.

Where each agent looks for it
Claude Code
.claude/skills/wensity-ui-copy/SKILL.md
Codex, Cursor, Copilot, Windsurf, Gemini CLI, OpenCode
.agents/skills/wensity-ui-copy/SKILL.md

When it loads

You never call a skill by name. Your agent reads the short description at the top of every installed skill and loads this one when the work calls for it. Requests like these bring it in:

  • The copy on this landing page sounds like an AI wrote it. Rewrite it.
  • Write better error messages for the sign-up form.
  • Fill this new dashboard with realistic sample data.

What it covers

Voice
Plain, short and calm, in the user's words and in sentence case everywhere.
Words that sound generated
The words and sentence shapes that give AI copy away, with what to write instead.
Headings, buttons and links
Headings that state the point, buttons that start with a verb and name the result, and link text that makes sense on its own.
Forms and errors
Labels above fields, placeholders that show a format, and errors that say what went wrong and how to fix it.
Empty, loading and success
Empty states that say what to do next, messages for slow work, toasts in the past tense and Undo in place of a confirm dialog.
Numbers and sample content
Consistent dates and units, and realistic names and data instead of lorem ipsum.

Check your own copy

Paste a headline, a button or a whole page. As you type, the checker marks the words and shapes the skill steers your agent away from, and each mark comes with the kind of fact that should replace it.

Without the skill: Typical generated hero copy: every line could sell any product.

Key rules

A heading says the point
It states what the reader learns, not the topic of the section.
Buttons start with a verb
Create invoice, not Submit. The label matches what happens next.
Destructive actions name the thing
Delete 3 files says exactly what will be gone.
Undo over confirm
Reversible actions just happen and offer Undo. Only permanent ones ask first.
Never invent proof
No made-up customer logos, star ratings or user counts in sample content.
Calm by default
No exclamation marks unless something genuinely worth celebrating happened.

Submit a form that fails

The address is taken and the email is missing its ending. Press the button, then fix the form with only what the message tells you.

Without the skill

Create Account

Without the skill: “Something went wrong” on every failure, so the visitor has to guess which field to change.

With the skill

Create your workspace

With the skill: The banner says what failed, each field says how to fix it, and a taken address offers free ones.

Rewrites, side by side

Twenty strings a model writes by default, next to what it writes with the skill loaded. Each fix adds a fact the reader can act on: a name, a number, a limit or the next step.

Signed out while editingWithout the skill: UnauthorizedWith the skill: You were signed out after 30 minutes away. Sign in again and your draft will still be here.
A name that is takenWithout the skill: Name already existsWith the skill: A project called “Spring launch” already exists. Pick another name or open that project.
Hit a rate limitWithout the skill: Too many requestsWith the skill: You can send 50 invites an hour. You can send more at 3:00 PM.
Dates in the wrong orderWithout the skill: Invalid date rangeWith the skill: The end date is before the start date. Pick an end date after Mar 4.
A file type it can't readWithout the skill: Unsupported formatWith the skill: This photo is a HEIC file. Export it as JPG or PNG and upload it again.

The full skill

This is the whole skill, exactly as your agent reads it. Change anything you like once it is in your project: it is a plain file.

Words are part of the design. Vague or inflated copy makes a polished interface feel generic; plain, specific copy makes a plain interface feel trustworthy. The test for every string: does it help someone understand or act?

1. Voice

  • Plain words. Write the way a helpful person would say it out loud. "Save changes", not "Persist modifications". "You're out of credits", not "Credit balance depleted".
  • The user's words, not the system's. "Notifications", not "Webhook dispatch config". Name things by what people do with them.
  • Short. Cut every word that does not change the meaning. Then cut again.
  • Sentence case everywhere: headings, buttons, menu items, tabs, labels. "Create new project", not "Create New Project".
  • Active voice, addressed to the user. "You don't have access to this project", not "Access to this project is not permitted". When the system failed, say so plainly: "We couldn't save your file", not "The file could not be saved".
  • Calm. No exclamation marks except for genuine celebrations, no apologies in errors, no jokes in error states.

2. Words that make copy sound generated

Avoid these. They say nothing a reader can check:

  • Verbs: unlock, unleash, elevate, empower, supercharge, revolutionize, transform, streamline, leverage, harness, reimagine, skyrocket.
  • Adjectives: seamless, effortless, cutting-edge, next-generation, world-class, robust, powerful, intuitive, innovative, all-in-one.
  • Phrases: "In today's fast-paced world", "Take your X to the next level", "Whether you're a X or a Y", "Say goodbye to", "Look no further".
  • Shapes: three adjectives in a row ("Fast. Secure. Simple."), middle-dot lists (Design · Build · Ship), and em dashes anywhere in the product's text, including the page <title>, meta description and alt text. Use a colon, a comma or two sentences: "Ledgerline: invoices in any currency".

Replace each with a concrete fact: what it does, how fast, for whom, with what result. "Cuts a 40-minute report to 2 minutes" beats "Supercharge your workflow".

3. Headings

  • A heading says the point, not the topic. "Invoices get paid 9 days faster" beats "Features". "Your workspace is empty" beats "Workspace".
  • No eyebrows. Do not put a small uppercase label above a heading ("FEATURES", "PRICING", "HOW IT WORKS"). Write a heading that stands alone.
  • Page titles name the page so people know where they are: "Billing", "Team members".
  • Start with a verb and name the result: "Create invoice", "Send invite", "Export CSV". Not "Submit", "OK", "Yes", "Click here", "Learn more" alone.
  • Match the button to what happens next. If the button says "Publish", the toast says "Published", and the page shows the published state.
  • Primary and secondary must be clearly different actions: "Delete project" and "Cancel", not "Yes" and "No".
  • One to three words is ideal. A CTA can go to five if it adds a concrete benefit ("Start free, no card").
  • Link text makes sense alone (screen readers list links out of context): "Read the API guide", not "here".
  • Destructive actions name the thing: "Delete 3 files", "Remove Sam from team".

5. Forms

  • Labels above fields, always visible. Placeholder text is not a label; it disappears when typing starts.
  • Placeholders show format, not instructions: name@company.com, MM / YY. Leave them out when the label is enough.
  • Helper text under the field for rules people need before typing: "At least 12 characters".
  • Mark optional fields, not required ones, when most fields are required: "Company (optional)".
  • Validate on blur or submit, not on every keystroke. Show the error next to the field it belongs to.

6. Errors

Every error answers two questions: what happened, and what to do now.

WeakBetter
Invalid inputEnter a date after today
Something went wrongWe couldn't reach the server. Check your connection and try again.
Error 403You don't have access to this project. Ask an owner to invite you.
Upload failedThis file is 24 MB. The limit is 10 MB.
Payment declinedYour card was declined. Try another card or contact your bank.
  • Never blame the user ("You entered an invalid email"). Describe the fix ("Enter an email like name@company.com").
  • Keep codes and stack traces out of the message. Put a reference ID at the end if support needs one.
  • Keep what the user typed. Never clear a form because one field failed.

7. Empty states

An empty state is the first thing a new user sees. Treat it as onboarding:

  1. Say what will appear here: "Invoices you send will show up here."
  2. Give the one action that fills it: a primary button, "Create invoice".
  3. Optional: a link to import, a template, or a short guide.

For "no results" empties, say what was searched and how to widen it: "No results for 'invioce'. Check the spelling or clear filters."

8. Loading, success and toasts

  • Loading: say what is happening when it takes more than a second: "Generating report…". Use the ellipsis character.
  • Success toasts: past tense of the action, plus the object: "Invite sent to sam@acme.com", "Project deleted. Undo".
  • Offer Undo instead of a confirmation dialog for reversible actions. Ask for confirmation only when the action cannot be undone.
  • Confirmation dialogs: the title asks the real question ("Delete 'Q3 report'?"), the body states the consequence ("This removes it for everyone. You can't undo this."), the buttons name the action ("Delete report" / "Cancel").

9. Numbers, dates and units

  • Use numerals: "3 files", not "three files".
  • Format with the user's locale: Intl.NumberFormat and Intl.DateTimeFormat (or toLocaleString) instead of hand-built strings.
  • Relative time for recent events ("2 min ago"), absolute dates for older ones ("Mar 4"), and the full timestamp in a tooltip.
  • Pluralize correctly: "1 file", "2 files", "0 files". Use Intl.PluralRules or a helper, never "file(s)".
  • Keep numbers and units together with a non-breaking space (10&nbsp;MB in HTML, "10\u00A0MB" in JavaScript) so they never wrap apart.

10. Realistic placeholder content

When building a design without real content, write content that looks real:

  • Specific names and data: "Maya Chen, Product designer at Northwind", "$12,480.00", "Invoice INV-2041". Not "John Doe", "$XX", "Lorem ipsum".
  • Realistic lengths, including some long ones, so the layout is tested: a 40-character name, a 3-line description next to a 1-line one.
  • Never invent proof. No made-up customer logos, star ratings, user counts or testimonials presented as real. Use marked placeholders ([Customer quote], [Logo]) or ask the user for the real ones.
  • Match the product's world. A dev tool's sample data is repos and deploys; a clinic app's is appointments and patients.

11. Accessibility in copy

  • Every icon-only button gets an accessible name: aria-label="Close dialog".
  • Alt text describes what an image shows when it carries information ("Bar chart: revenue up 24% since January"). Decorative images get alt="".
  • Do not rely on color words alone ("click the green button").
  • Expand abbreviations the first time unless the audience uses them daily.

12. Check before you finish

  • No filler words from section 2, no three-adjective taglines, no em dashes in interface strings.
  • Every heading states a point; no eyebrows.
  • Every button starts with a verb and names its result.
  • Every error says what happened and what to do.
  • Every empty state explains itself and offers the next action.
  • Sentence case throughout.
  • Sample content is specific, varied in length, and contains no invented proof.
  • Icon-only controls and meaningful images have accessible text.

Works well with

  • Typography

    Free

    Fonts, a role-based type scale, line height, tracking, measure, line breaks, numbers and font loading.

  • Landing page

    Pro

    Message first, page structure, hero, real proof, features, pricing, FAQ, motion and performance.

  • Accessibility and UI states

    Pro

    Every interaction and data state, plus keyboard, touch, zoom, forced colors and screen readers.