From ios-platform
UX writing for iOS app interfaces — voice, microcopy, alerts, errors, empty states, buttons, destructive actions, and accessibility labels. Use when writing or reviewing any user-facing text in the app.
How this skill is triggered — by the user, by Claude, or both
Slash command
/ios-platform:beepus-maximus-ios-ux-writingThe summary Claude sees in its skill listing — used to decide when to auto-load this skill
Write clear, purposeful interface copy for iOS apps. Every string the user sees should earn its place.
Write clear, purposeful interface copy for iOS apps. Every string the user sees should earn its place.
Owns:
Does NOT own:
shipping)Before writing any copy, establish the product's voice:
clarity > voice > craft rules
Each voice quality is a dial you turn up or down per situation:
| Situation | Turn Up | Turn Down |
|---|---|---|
| Celebrating a milestone | Warmth, encouragement | Formality |
| Error state | Clarity, helpfulness | Playfulness |
| Destructive action | Precision, gravity | Casualness |
| Empty state | Helpfulness, invitation | Urgency |
| Permission request | Transparency, respect | Enthusiasm |
From WWDC22 "Writing for Interfaces":
Test: remove the word. If neither meaning nor intentional tone changes, cut it.
If the headline and body say the same thing, collapse them:
// BAD — says the same thing twice
Title: "No Workouts Found"
Body: "You don't have any workouts yet."
// GOOD — body adds new information
Title: "No Workouts"
Body: "Start a workout to see your history here."
// BAD
"Can't open this file"
"An error occurred"
"Item saved"
// GOOD
"Can't open 'Report.pdf' — the file may be corrupted"
"Unable to save: storage is full (42 MB needed)"
"Workout saved to Wednesday, March 25"
The app is not a person. Passive or direct constructions are clearer:
// BAD
"We're having trouble loading your data"
"We couldn't find any results"
// GOOD
"Unable to load data. Check your connection and try again."
"No results for 'magnesim'. Check the spelling?"
// BAD
"0 results found"
"1 items selected"
// GOOD
"No results" / "1 result" / "24 results"
"No items selected" / "1 item selected" / "3 items selected"
Test with real values including edge cases: long names, large numbers, empty strings.
// BAD
Title: "Are you sure?"
Body: "This action cannot be undone."
Buttons: [Cancel] [OK]
// GOOD
Title: "Delete 'Morning Routine'?"
Body: "This removes the routine and its 12 logged entries. This can't be undone."
Buttons: [Keep Routine] [Delete Routine]
Say what happened → explain why (if helpful) → tell what to do next:
// BAD
"Error: Invalid input"
"Oops! Something went wrong."
// GOOD
"Unable to save supplement — the name field is required."
"Can't connect to Health. Open Settings → Privacy → Health to grant access."
No jargon. No blaming the user. No interjections ("Oops!", "Uh oh!").
// BAD
Buttons: [Cancel] [Confirm]
// GOOD
Title: "Cancel Subscription?"
Body: "You'll lose access to premium features on April 12. Your data will be kept."
Buttons: [Keep Subscription] [Cancel Subscription]
Tell what will appear → how to make it happen → include a clear action:
ContentUnavailableView {
Label("No Supplements", systemImage: "pill")
} description: {
Text("Tap + to add your first supplement.")
} actions: {
Button("Add Supplement") { addSupplement() }
}
Match tone to context: first-time empty is inviting; search-empty is helpful; error-empty is reassuring.
accessibilityHint sparingly — only when the action isn't obvious from the label.destructive role and name the destruction| Banned | Why | Replace With |
|---|---|---|
| "Oops!" / "Uh oh!" | Patronising, adds nothing | State the problem directly |
| "Something went wrong" | Vague, unhelpful | Specific error with recovery action |
| "Submit" / "Continue" / "Done" (generic) | Tells user nothing about the action | Specific verb: "Save Changes", "Start Workout" |
| "Elevate" / "Seamless" / "Unleash" / "Next-Gen" | Marketing fluff | Direct description of what it does |
| "Invalid input" / "Error occurred" | Developer speak | Human language: "Name is required" |
| "We're having trouble" | No "we" | "Unable to load data" |
| "0 results found" | Unnatural | "No results" |
| "Are you sure?" as alert title | Wastes the title slot | Restate the action: "Delete 'Morning Routine'?" |
| "Please try again later" | Vague, unhelpful | Specific: "Check your connection and pull to refresh" |
| Exclamation marks in errors | Sounds alarmed | Period or no punctuation |
When writing copy that will be localized:
String(localized: "\(count) items") not "\(count) items"npx claudepluginhub 4eleven7/claude-skills --plugin ios-platformProvides a checklist for code reviews covering functionality, security, performance, maintainability, tests, and quality. Use for pull requests, audits, team standards, and developer training.