skills / design

ux-copy

what it does

Write or review UX copy — microcopy, error messages, empty states, CTAs. Trigger with "write copy for", "what should this button say?", "review this error message", or when naming a CTA, wording a confirmation dialog, filling an empty state, or writing onboarding text.

Verified Before and after: 2 models 1 try per case View source Download .zip

Compare the answers

Answers from Claude Sonnet 5.5 and GPT-6.1 Sol · try 1 of 1

Same request, same model, once with the skill and once without. Read both and judge for yourself.

“Can you rewrite these three error messages? Users keep contacting support about them.”

Source material given with the request

App: Tallyroom, team expense tracking (web). 1. Payment form, shown when the card is declined by the bank: "Error 4012: Operation failed." 2. Sign-up password field, shown when the password is under 12 characters or has no number: "Invalid input." 3. Receipt upload, shown when the file is over the 25 MB limit: "Something went wrong. Please try again later."
with the skill
## UX Copy: Tallyroom Error Messages ### Recommended Copy **1. Payment form: card declined by bank** > **Payment declined.** Your bank declined this card. Try a different card, or contact your bank to find out why. **2. Sign-up password field: under 12 characters or no number** > **Password needs at least 12 characters and one number.** For a better experience, validate each rule separately and show only the unmet one(s): > - Use at least 12 characters > - Include at least one number **3. Receipt upload: file over 25 MB** > **File is too large.** Receipts can be up to 25 MB. Compress the file or upload a smaller version, then try again. ### Alternatives | Option | Copy | Tone | Best For |
Show the rest (34 more lines)
|--------|------|------|----------| | **1A** | "Card declined. Your bank didn't approve this payment. Try another card or call your bank." | Direct, brief | Narrow layouts, inline form errors | | **1B** | "We couldn't process this card. Your bank declined the payment. Try a different card or contact your bank for details." | Empathetic, soft | Users who may feel embarrassed about a decline | | **1C** | "Payment declined by your bank. Please use a different card or contact your bank." | Formal | Finance-heavy or enterprise audiences | | **2A** | "Almost there. Add at least 12 characters and one number." | Friendly | Consumer-leaning onboarding | | **2B** | "Your password is too short. Use at least 12 characters." (or) "Add at least one number to your password." | Specific, adaptive | When you can detect which rule failed | | **2C** | "Password must be 12+ characters and include a number." | Compact | Tight inline space | | **3A** | "This file is over the 25 MB limit. Try a smaller file or compress it." | Direct | Inline upload errors | | **3B** | "That file is too big to upload. Receipts must be under 25 MB. Try compressing it or taking a lower-resolution photo." | Helpful, conversational | Mobile-photo-heavy users | | **3C** | "Upload failed: file exceeds 25 MB. Choose a smaller file." | Neutral, technical | Power users, admin contexts | ### Rationale - **Declined card:** The old message exposes an internal code and says nothing useful. Naming the cause (the bank declined it) tells users the problem isn't with Tallyroom, which cuts the "is your app broken?" tickets. The two next steps (different card, call the bank) give them a path forward. - **Password:** "Invalid input" doesn't say what's invalid or why. Stating the requirements in the error removes guesswork. Showing the rules before the user types (as helper text) will reduce errors even further. - **File size:** "Something went wrong, try later" is actively misleading, since retrying the same file will fail every time. Stating the limit and the fix lets users resolve it immediately. Mentioning compression helps people who don't know how to shrink a file. - All three follow the pattern **what happened, why, how to fix**, and use the same terms the user sees in the UI (card, password, file/receipt). ### Implementation Notes - **Don't hide the cause behind a generic message.** If the system can distinguish between decline reasons (insufficient funds, expired card, etc.), consider showing the more specific message. But only if your payment provider allows it. Some banks don't return reasons, and the generic "declined by your bank" is safest. - **Keep error code 4012 in logs or a "Details" link** for support, but don't lead with it. - **Show the password requirements persistently** beneath the field, not only after an error. - **Check the file size on selection**, before upload starts, so users don't wait for a failed upload. - If a tester sees "Something went wrong" elsewhere in the app, apply the same scrutiny. It's usually a sign of a missing, specific error state. ### Localization Notes - **"Declined"** has a specific financial meaning. Make sure translations don't read as "rejected" in a personal sense. - **"Contact your bank"** may need adapting where users commonly visit a branch or use a different channel. - **Units:** Keep "MB" as is, but check whether your locales expect "Mo" (French) or "Mb" notation. - **Character expansion:** German and Finnish may run 30-40% longer. The password and file-size messages are the tightest, so leave room in the layout or use the compact alternatives (2C, 3A). - **"12 characters and one number"**: Use number formatting and plural rules properly in locales with complex plurals (e.g., Russian, Polish). Use ICU message format or equivalent for the variable counts. - Avoid idioms like "Almost there" (2A) in localized versions unless you have a vetted equivalent.
without
Here are rewrites that say what happened and what to do next. **1. Card declined (payment form)** > Your bank declined this card. Please try a different card, or contact your bank to find out why. > <span style="color:gray">Error 4012</span> I kept the code in small text at the end so support can still use it, but it no longer leads the message. Banks often don't share the reason for a decline, so the message sends users to the one party who can tell them. **2. Password requirements (sign-up)** > Password must be at least 12 characters and include at least one number. If you can show errors dynamically, tailor it to what's missing: - "Add at least one number to your password." - "Password needs to be at least 12 characters. You've used 8." - "Password must be at least 12 characters and include a number." (when both fail) Even better, show the requirements under the field before the user types, so the error is rarely needed. **3. File too large (receipt upload)** > This file is too large. Receipts can be up to 25 MB. Try compressing the file or uploading a lower-resolution version.
Show the rest (6 more lines)
This replaces a generic "something went wrong" that implied a temporary system fault. Users were likely retrying and hitting the same limit. The new message names the cause and the limit, and it suggests a fix. **General tips** - Show each message next to the field or action that caused it. - Avoid blaming language like "You entered an invalid password." - If you log error codes, include them in small text or a "Details" expander rather than as the main message.

Answers are shown exactly as the model wrote them, from the first try, and nothing is picked by hand.

The models

2 models

Claude Sonnet 5.5

made by Anthropic

claude-sonnet-5-5 · revision not reported by the provider

1 try per case · tested 3 Nov 2026

GPT-6.1 Sol

made by OpenAI

gpt-6.1-sol · revision not reported by the provider

1 try per case · tested 3 Nov 2026

The tasks

written by Carte Blanche
delete-workspace-dialog

“Rewrite this confirmation dialog. It shows when someone deletes a workspace.”

onboarding-consistency

“Review the copy on these three onboarding screens before we ship.”

reports-empty-state

“Our Reports page just says 'No data.' when someone hasn't made any reports yet. Write a better empty state. The button can be at most 20 characters.”

trial-button-label

“The button on our pricing page just says 'Submit'. It starts a 14-day free trial, no card needed. What should it say?”

vague-error-messages

“Can you rewrite these three error messages? Users keep contacting support about them.”

Install

Download the .zip and unzip it. Put its files, in a folder named ux-copy, here:

Claude Code~/.claude/skills/Every project. For one project only, use .claude/skills/ inside it.
Codex~/.agents/skills/Every project. For one repository only, use .agents/skills/ inside it.
Cursor~/.cursor/skills/Cursor also reads the Claude Code and Codex folders above.

Then start a new session and ask for what the skill does. Other agents that read SKILL.md have their own skills folder; check their docs.

Coming after launch: get skills from inside your agent, no download needed.