
Ux Writing
- 1.3k installs
- 139 repo stars
- Updated May 26, 2026
- content-designer/ux-writing-skill
ux-writing is a design skill that generates clear, concise, accessible interface microcopy for developers and designers who need purposeful button, form, error, and onboarding text in digital products.
About
ux-writing is a design skill for developers and designers writing any text that appears in apps, websites, or software interfaces. It applies four quality standards—purposeful, concise, conversational, and clear—to buttons, labels, error messages, notifications, forms, onboarding, empty states, success messages, and help text. The skill also covers conversational flows, voice and tone guidelines, content consistency audits, UI string reviews, and accessibility guidelines backed by research benchmarks. Reach for ux-writing when shipping new UI components, rewriting cryptic errors, standardizing tone across a product, or auditing existing interface copy for usability. It turns engineering-facing drafts into user-centered microcopy aligned with accessibility and clarity best practices rather than marketing prose.
- Creates purposeful, concise, conversational, and clear interface copy using four core quality standards
- Includes accessibility guidelines, research-backed benchmarks on sentence length and reading levels
- Expanded error message patterns and tone adaptation frameworks
- Comprehensive reference materials for consistent voice and tone across products
- Works for buttons, labels, forms, notifications, empty states, success messages, and help text
Ux Writing by the numbers
- 1,254 all-time installs (skills.sh)
- +87 installs in the week ending Aug 5, 2026 (Skillselion tracking)
- Ranked #321 of 1,880 Design & UI/UX skills by installs in the Skillselion catalog
- Security screen: MEDIUM risk (skills.sh audit)
- Data as of Aug 5, 2026 (Skillselion catalog sync)
npx skills add https://github.com/content-designer/ux-writing-skill --skill ux-writingAdd your badge
Show developers this skill is listed on Skillselion. Paste this into your README.
| Installs | 1.3k |
|---|---|
| repo stars | ★ 139 |
| Security audit | 3 / 3 scanners passed |
| Last updated | May 26, 2026 |
| Repository | content-designer/ux-writing-skill ↗ |
How do you write clear accessible microcopy for UI components?
Generate clear, concise, accessible microcopy for buttons, forms, error messages, onboarding flows, and all interface text.
Who is it for?
Developers and designers shipping UI who need accessible, concise microcopy for buttons, forms, errors, and onboarding instead of marketing-style prose.
Skip if: Long-form blog posts, legal contracts, or brand strategy documents outside interface text.
When should I use this skill?
The user writes or edits button labels, form text, error messages, onboarding flows, empty states, or audits UI strings for clarity and accessibility.
What you get
Revised UI strings, error messages, form labels, onboarding copy, and voice-and-tone-aligned microcopy ready for implementation.
- UI microcopy strings
- Error and form label rewrites
- Voice and tone guidance
By the numbers
- Applies 4 quality standards: purposeful, concise, conversational, and clear
Files
UX Writing
Write clear, concise, user-centered interface copy (UX text/microcopy) for digital products and experiences. This skill provides frameworks, patterns, and best practices for creating text that helps users accomplish their goals.
Compatible with: Claude, Codex, Cursor, and other agents that support the agent skills specification.
Note: This skill works with Codex CLI/IDE, not ChatGPT. ChatGPT cannot install or use skills.
When to Use This Skill
Use this skill when:
- Writing interface copy (buttons, labels, titles, messages, forms)
- Editing existing UX text for clarity and effectiveness
- Creating error messages, notifications, or success messages
- Designing conversational flows or onboarding experiences
- Establishing voice and tone for a product
- Auditing product content for consistency and usability
Core UX Writing Principles
The Four Quality Standards
Every piece of UX text should be:
1. Purposeful — Helps users or the business achieve goals 2. Concise — Uses the fewest words possible without losing meaning 3. Conversational — Sounds natural and human, not robotic 4. Clear — Unambiguous, accurate, and easy to understand
Key Best Practices
Conciseness
- Use 40-60 characters per line maximum
- Every word must have a job
- Break dense text into scannable chunks
- Front-load important information
Clarity
- Use plain language (7th grade reading level for general, 10th for professional)
- Avoid jargon, idioms, and technical terms
- Use consistent terminology throughout
- Choose meaningful, specific verbs
Conversational Tone
- Write how you speak
- Use active voice 85% of the time
- Include prepositions and articles
- Avoid robotic phrasing
User-Centered
- Focus on user benefits, not features
- Anticipate and answer user questions
- Use second-person ("you") language
- Match user's language and mental models
UX Text Patterns
Apply these common patterns for interface elements.
Titles
- Purpose: Orient users to where they are
- Format: Noun phrases, sentence case
- Types: Brand titles, content titles, category titles, task titles
- Examples: "Account settings", "Your library", "Create new post"
Buttons and Links
- Purpose: Enable users to take action
- Format: Active imperative verbs, sentence case
- Pattern:
[Verb] [object] - Examples: "Save changes", "Delete account", "View details"
- Avoid: Generic labels like "OK", "Submit", "Click here"
Error Messages
- Purpose: Explain problem and provide solution
- Format: Empathetic, clear, actionable
- Pattern:
[What failed]. [Why/context]. [What to do].
Error Message Types
Validation Errors (Inline)
- Show as user completes field or on blur
- Brief, specific guidance to correct input
- Pattern:
[Field] [specific requirement] - Examples:
- "Email must include @"
- "Password must be at least 8 characters"
- "Choose a date in the future"
- Timing: Real-time or on field exit
- Location: Below or beside the field
System Errors (Modal/Banner)
- Show when backend operations fail
- Explain what happened and why
- Pattern:
[Action failed]. [Likely cause]. [Recovery step]. - Examples:
- "Payment failed. Your card was declined. Try a different payment method."
- "Couldn't save changes. Connection lost. Reconnect and try again."
- "Upload failed. File is too large. Choose a file under 10MB."
- Timing: Immediately after failure
- Location: Modal dialog or prominent banner
Blocking Errors (Full-screen)
- Prevent continued use until resolved
- Clear explanation of blocker and resolution
- Pattern:
[What's blocked]. [Why]. [Specific action needed]. - Examples:
- "Update required. This version is no longer supported. Update now to continue."
- "Subscription expired. Your account is paused. Renew subscription to restore access."
- "Verification needed. Confirm your email to access features. Check your inbox."
- Timing: On app launch or feature access
- Location: Full screen or large modal
Permission Errors
- Explain benefit before requesting permission
- Pattern:
[User benefit]. [Permission needed]. - Examples:
- "Get notified when orders ship. Enable notifications."
- "Find nearby stores. Allow location access."
- "Back up your photos. Grant storage permission."
- Timing: When feature is first used
- Location: In context of the feature
What to Avoid
- Technical codes without explanation ("Error 403")
- Blame language ("invalid input", "illegal character")
- Robotic tone ("An error has occurred")
- Dead ends (error with no recovery path)
- Vague causes ("Something went wrong")
Success Messages
- Purpose: Confirm action completion
- Format: Past tense, specific, encouraging
- Pattern:
[Action] [result/benefit] - Examples: "Changes saved", "Email sent", "Profile updated"
Empty States
- Purpose: Guide users when content is absent
- Types: First-use, user-cleared, error/no results
- Format: Explanation + CTA to populate
- Example: "No messages yet. Start a conversation to connect with your team."
Form Fields
- Labels: Clear noun phrases describing input ("Email address", "Phone number")
- Instructions: Verb-first, explain why information is needed
- Placeholder: Use sparingly, only for standard inputs like "name@example.com"
- Helper text: Static, on-demand, or automatic based on importance
Notifications
- Purpose: Deliver timely, valuable information
- Types: Action-required (intrusive), Passive (less intrusive)
- Format: Verb-first title + contextual description
- Example: "Update required. Install the latest version to continue."
Voice and Tone
Voice (Consistent Brand Personality)
Voice is the consistent personality of the product. Establish voice using:
- Concepts: 3-5 key brand principles/values
- Voice characteristics: Descriptive adjectives for each concept
- Do/Don't examples: Concrete examples showing voice in action
See references/voice-chart-template.md for creating a voice chart.
Tone (Adaptive to Context)
Tone is how voice adapts to specific situations. While voice remains constant, tone shifts based on user context and emotional state.
Tone Variables
- Purpose: Why user is seeing this text (information, action, confirmation)
- Context: What user is trying to do (learning, completing task, recovering from error)
- Emotional state: How user likely feels (frustrated, excited, confused, cautious)
- Stakes: Impact of the action (low: changing theme, high: deleting account)
Tone Adaptation by User Emotional State
Frustrated (errors, failures, blockers)
- Empathetic and solution-focused
- Acknowledge the problem without blame
- Provide clear recovery path
- Example: "Payment failed. Your card was declined. Try a different payment method."
Confused (first use, complex features)
- Patient and explanatory
- Break down steps clearly
- Provide context and guidance
- Example: "Connect your bank to see spending insights. We'll guide you through it."
Confident (routine tasks, return visits)
- Efficient and direct
- Minimal explanation
- Quick confirmation
- Example: "Saved"
Cautious (high-stakes actions, data loss)
- Serious and transparent
- Clear consequences
- Respectful of user's decision
- Example: "Delete account? You'll lose all data and this can't be undone."
Successful (completions, achievements)
- Positive and encouraging
- Proportional to achievement
- Brief celebration
- Example: "Profile updated. Your changes are live."
Tone Adaptation by Content Type
Error messages: Empathetic, reassuring, solution-focused
- Never blame user
- Explain what happened
- Provide clear next step
Success messages: Positive, specific, encouraging
- Confirm what happened
- Proportional to action importance
- Brief and clear
Instructions: Clear, direct, helpful
- Front-load key action
- Explain why when needed
- Use simple steps
Onboarding: Inviting, encouraging, concise
- Welcome without overwhelming
- Focus on value
- Celebrate early wins
Confirmations: Serious, transparent, respectful
- Clear about consequences
- No manipulation
- Easy to back out
Empty states: Hopeful, actionable, guiding
- Explain why it's empty
- Provide clear next action
- Keep encouraging tone
Editing Process
Edit UX text in four phases:
Phase 1: Purposeful
- Does text help user achieve their goal?
- Does text serve business objectives?
- Is value to user clear?
- Are concerns anticipated and addressed?
Phase 2: Concise
- Remove unnecessary words
- Combine redundant information
- Ensure every word earns its space
- Front-load important concepts
Phase 3: Conversational
- Read aloud—would you say this?
- Use active voice (unless passive is clearer)
- Include natural connecting words
- Avoid corporate jargon
Phase 4: Clear
- Use specific, accurate verbs
- Maintain consistent terminology
- Test readability (Hemingway Editor, Flesch-Kincaid)
- Ensure unambiguous meaning
Workflow
1. Understand context
- User goals and needs
- Business objectives
- Technical constraints
- Emotional state of user
2. Draft content
- Start with conversation (what would you say?)
- Apply appropriate pattern
- Consider voice and tone
- Front-load important information
3. Edit iteratively
- Phase 1: Purposeful
- Phase 2: Concise
- Phase 3: Conversational
- Phase 4: Clear
4. Test and measure
- Review with team
- Test with users when possible
- Measure task completion, comprehension
- Iterate based on feedback
Accessibility in UX Writing
Writing accessible content ensures all users, including those using assistive technology, can understand and interact with your product.
Core Accessibility Principles
Screen Reader Optimization
- Label all interactive elements explicitly ("Submit form" not just "Submit")
- Write descriptive link text ("Read pricing details" not "Click here")
- Structure error messages to work with screen readers (error + field label read together)
- Use ARIA labels when visual context isn't sufficient
Cognitive Accessibility
- Target 8-14 words per sentence (8 words = 100% comprehension, 14 words = 90%)
- Break complex information into scannable chunks
- Use clear headings and logical hierarchy
- Provide consistent, predictable patterns
Multi-Modal Communication
- Don't rely on color alone to convey meaning
- Pair visual indicators with text ("Error: Email required" with red icon)
- Provide text alternatives for icons and images
- Ensure sufficient color contrast (WCAG AA minimum: 4.5:1)
Plain Language for All
- Target 7th-8th grade reading level for general audience
- Define technical terms when first used
- Avoid idioms, metaphors, and cultural references
- Use common, everyday words
Accessible Pattern Examples
Buttons
- ❌ Poor: "Submit" (context missing for screen readers)
- ✅ Good: "Submit application"
Links
- ❌ Poor: "Click here for more information"
- ✅ Good: "Read our privacy policy"
Error Messages
- ❌ Poor: Red text showing "Invalid"
- ✅ Good: "Error: Email must include @" (with error icon)
Form Labels
- ❌ Poor: Placeholder-only fields
- ✅ Good: Visible label + optional placeholder
UX Text Benchmarks
Use these research-backed metrics to create effective UX text.
Sentence Length Targets
By Content Type
- Buttons/CTAs: 2-4 words ideal, 6 word maximum
- Titles: 3-6 words, 40 characters maximum
- Error messages: 12-18 words (including solution)
- Instructions: 20 words maximum, 14 ideal
- Body copy: 15-20 words per sentence average
- Notifications: 10-15 words for title + body
Comprehension Rates
- 8 words or fewer: 100% user comprehension
- 14 words or fewer: 90% user comprehension
- 25 words: Maximum before significant comprehension drop
Character and Line Length
Optimal Ranges
- Line length: 40-60 characters for maximum readability
- Button labels: 15-25 characters
- Page titles: 30-50 characters
- Notification titles: 35-45 characters
Reading Level Guidelines
By Audience
- General public: 7th-8th grade (Flesch-Kincaid)
- Professional tools: 9th-10th grade
- Technical products: 10th-11th grade
- Specialized fields: 11th-12th grade (only when necessary)
Testing Tools
- Hemingway Editor: Highlights complex sentences
- Readable.com: Provides multiple readability scores
- Microsoft Word: Built-in Flesch-Kincaid scoring
Common Mistakes to Avoid
- Using passive voice excessively
- Generic button labels ("Submit", "OK")
- Blaming users in error messages
- Overly clever humor in serious contexts
- Inconsistent terminology
- Hidden instructions or explanations
- System-oriented language vs. user language
- Too many words (not concise enough)
- Robotic, corporate tone
- Relying on color alone for meaning
- Writing inaccessible link text ("Click here")
Quick Reference
Sentence case: "Save your changes" (not "Save Your Changes") Active imperative for buttons: "Delete account" (not "Account deletion") User-focused: "Save time with shortcuts" (not "We offer shortcuts") Specific verbs: "Delete" (not "Remove" when permanently deleting) Front-loaded: "Password must be 8 characters" (not "Must be 8 characters for your password")
Resources
This skill includes:
- references/accessibility-guidelines.md: Comprehensive guide to writing accessible UX text for all users
- references/voice-chart-template.md: Template for creating a product voice chart
- references/content-usability-checklist.md: Comprehensive checklist for evaluating UX text quality
- references/patterns-detailed.md: Extended examples of UX text patterns in different voices
- examples/real-world-improvements.md: Before/after transformations with detailed analysis and scoring
- templates/error-message-template.md: Fillable template for writing effective error messages
- templates/empty-state-template.md: Guide for creating helpful empty states
- templates/onboarding-flow-template.md: Framework for designing clear onboarding experiences
- docs/figma-integration.md: Guide for using this skill with Figma MCP (Claude Code, Codex, and Cursor)
.github/** export-ignore
.gitattributes export-ignore
.gitignore export-ignore
CHANGELOG.md export-ignore
CONTRIBUTING.md export-ignore
LICENSE export-ignore
README.md export-ignore
VERSIONING.md export-ignore
build-skill.sh export-ignore
claude-ux-writing-skill-demo.mp4 export-ignore
codex-ux-writing-skill-demo.mp4 export-ignore
dist/** export-ignore
index.html export-ignore
name: Auto-rebuild Skill Package
on:
push:
branches: [main]
paths:
- 'SKILL.md'
- 'docs/**'
- 'examples/**'
- 'references/**'
- 'templates/**'
- 'build-skill.sh'
jobs:
rebuild:
runs-on: ubuntu-latest
# Grant write permissions to contents and pull-requests
permissions:
contents: write
pull-requests: write
# Skip if commit was made by the bot to prevent infinite loops
if: "!contains(github.event.head_commit.message, '[auto-rebuild]')"
steps:
- uses: actions/checkout@v4
with:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Build skill package
run: ./build-skill.sh
- name: Check for changes
id: check_changes
run: |
if git diff --quiet dist/ux-writing-skill.zip; then
echo "changed=false" >> $GITHUB_OUTPUT
else
echo "changed=true" >> $GITHUB_OUTPUT
fi
- name: Create Pull Request
if: steps.check_changes.outputs.changed == 'true'
run: |
BRANCH_NAME="auto-rebuild-$(date +%s)"
git config --local user.email "github-actions[bot]@users.noreply.github.com"
git config --local user.name "github-actions[bot]"
git checkout -b "$BRANCH_NAME"
git add dist/ux-writing-skill.zip
git commit -m "Auto-rebuild skill package [auto-rebuild]"
git push -u origin "$BRANCH_NAME"
# Create PR using GitHub CLI
gh pr create \
--title "Auto-rebuild skill package" \
--body "Automated rebuild of skill package after changes to skill files." \
--base main \
--head "$BRANCH_NAME"
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
name: Build Skill Package
on:
release:
types: [published]
workflow_dispatch:
inputs:
tag:
description: 'Tag to build (leave empty for latest)'
required: false
jobs:
build:
runs-on: ubuntu-latest
permissions:
contents: write
steps:
- uses: actions/checkout@v4
with:
ref: ${{ github.event.release.tag_name || github.event.inputs.tag || github.ref }}
- name: Build skill package
run: |
chmod +x ./build-skill.sh
./build-skill.sh
- name: Upload skill package as artifact
uses: actions/upload-artifact@v4
with:
name: ux-writing-skill
path: dist/ux-writing-skill.zip
- name: Upload to release
if: github.event_name == 'release'
env:
GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
run: |
gh release upload "${{ github.event.release.tag_name }}" dist/ux-writing-skill.zip --clobber
name: Droid Review
permissions:
pull-requests: write # Needed for leaving PR comments
contents: read
issues: write
on:
pull_request:
types: [opened, synchronize, reopened, ready_for_review, edited]
# Cancel previous runs for the same PR
concurrency:
group: review-droid-${{ github.event.pull_request.number }}
cancel-in-progress: true
jobs:
code-review:
runs-on: ubuntu-latest
timeout-minutes: 15
# Skip draft PRs
if: github.event.pull_request.draft == false
steps:
- uses: Factory-AI/droid-code-review@latest
with:
factory-api-key: ${{ secrets.FACTORY_API_KEY }}
pr-number: ${{ github.event.pull_request.number }}
pr-head-sha: ${{ github.event.pull_request.head.sha }}
# Build output
# Note: dist/ is committed to enable direct downloads from GitHub
# The auto-rebuild workflow keeps it in sync when skill files change
# dist/
# OS files
.DS_Store
Thumbs.db
# Editor files
.vscode/
.idea/
*.swp
*.swo
*~
#!/bin/bash
# Build script to package UX Writing Skill for distribution
# This creates a ZIP file containing only the skill files needed by Claude
set -e
OUTPUT_DIR="dist"
ZIP_NAME="ux-writing-skill.zip"
echo "Building UX Writing Skill package..."
# Create dist directory if it doesn't exist
mkdir -p "$OUTPUT_DIR"
# Remove old ZIP if it exists
rm -f "$OUTPUT_DIR/$ZIP_NAME"
# Create ZIP with only skill-relevant files
zip -r "$OUTPUT_DIR/$ZIP_NAME" \
SKILL.md \
docs/ \
examples/ \
references/ \
templates/ \
-x "*.DS_Store" "*.git*"
echo "✓ Skill package created: $OUTPUT_DIR/$ZIP_NAME"
echo ""
echo "Contents:"
unzip -l "$OUTPUT_DIR/$ZIP_NAME"
Changelog
All notable changes to the UX Writing Skill will be documented in this file.
The format is based on Keep a Changelog, and this project adheres to Semantic Versioning.
[1.6.0] - 2026-03
Added
- Cursor Support: Full compatibility with Cursor; added to supported agents in README, SKILL.md, and all documentation
- Skills CLI Installation: Replaced per-tool install instructions with a single universal command (
npx skills add content-designer/ux-writing-skill) - Unified Figma Integration Guide: New
docs/figma-integration.mdcovering Claude, Codex, and Cursor in one place
Changed
- Updated README title and intro to reference Claude, Codex, and Cursor
- Simplified Installation section — single CLI command replaces three separate step-by-step guides
- Simplified Figma Integration section in README to link to the consolidated guide
- Made usage examples and explanations tool-agnostic throughout README
Removed
docs/claude-figma-integration.md(content merged intodocs/figma-integration.md)docs/codex-figma-integration.md(content merged intodocs/figma-integration.md)
---
[1.5.0] - 2026-01
Added
- OpenAI Codex Support: Full compatibility with Codex CLI and IDE extensions
- Codex Installation Guide: Step-by-step instructions for Codex users
- Codex Figma Integration: New guide at
docs/codex-figma-integration.md - Multi-Platform Documentation: Updated README and website for Claude + Codex
Changed
- Renamed
docs/figma-integration.mdtodocs/claude-figma-integration.mdfor clarity - Updated website to reflect multi-platform support
- Various terminology fixes (Codex = CLI/IDE, not ChatGPT)
---
[1.4.0] - 2025-12-24
Added
- Smithery Registry: Listed in Smithery skills registry for discoverability
- Smithery Badge: Added badge to README for easy installation
---
[1.3.0] - 2025-11-11
Added
- GitHub Pages Website: Interactive landing page at content-designer.github.io/ux-writing-skill
- Video Demonstration: Embedded demo showing skill in action
- Auto-Rebuild Workflow: GitHub Action to automatically rebuild skill ZIP on changes
Changed
- Reorganized skill packaging for cleaner distribution
- Improved download links and installation flow
- Enhanced modal windows with drag and resize functionality
---
[1.2.0] - 2025-11-10
Added
- Figma Integration Guide: New guide at
docs/figma-integration.mdfor reviewing UX copy directly from Figma designs - Improved Installation Instructions: Clearer steps for non-technical users
---
[1.1.0] - 2025-11-10
Added
- Accessibility Guidelines: Comprehensive accessibility section in SKILL.md covering:
- Screen reader optimization (ARIA labels, descriptive links, accessible buttons)
- Cognitive accessibility (sentence length targets, plain language)
- Multi-modal communication (not relying on color alone)
- Accessible pattern examples with do/don't comparisons
- New Reference: accessibility-guidelines.md with deep-dive coverage of:
- WCAG principles for UX writers (Perceivable, Operable, Understandable, Robust)
- Screen reader best practices with detailed examples
- Cognitive accessibility research (8 words = 100% comprehension)
- Plain language guidelines by audience type
- Writing for translation and localization
- High-stress context considerations
- Testing methods and tools
- Quick reference accessibility checklist
- UX Text Benchmarks: Research-backed metrics section including:
- Sentence length targets by content type (buttons, titles, errors, instructions)
- Comprehension rates (8 words = 100%, 14 words = 90%)
- Character and line length optimal ranges
- Reading level guidelines by audience (general, professional, technical)
- Testing tools recommendations (Hemingway, Readable.com, MS Word)
- Expanded Error Patterns: Detailed error message types with timing and location:
- Validation errors (inline) with examples and patterns
- System errors (modal/banner) with recovery flows
- Blocking errors (full-screen) with resolution paths
- Permission errors with benefit-first framing
- Comprehensive "what to avoid" guidance
- Tone Adaptation Framework: Structured approach to tone variation:
- Tone variables (purpose, context, emotional state, stakes)
- Tone adaptation by user emotional state (frustrated, confused, confident, cautious, successful)
- Tone adaptation by content type (errors, success, instructions, onboarding, confirmations, empty states)
- Concrete examples for each tone context
Improved
- Enhanced skill description to include accessibility, benchmarks, and expanded frameworks
- Updated Common Mistakes section to include accessibility anti-patterns
- Expanded Resources section to reference new accessibility guidelines
Context
This update addresses key gaps identified through research of public content design systems (Intuit, IBM Carbon, Material Design, Shopify Polaris, Atlassian) and incorporates industry-standard accessibility practices, quantifiable metrics, and expanded frameworks while maintaining copyright compliance through original synthesis and examples.
---
[1.0.0] - 2025-11-10
Added
- Initial release of UX Writing Skill
- Core SKILL.md with four quality standards framework
- Reference materials:
- Voice chart template for establishing brand personality
- Content usability checklist for evaluating text quality
- Detailed pattern examples across three different product voices
- Examples directory with real-world improvements:
- Before/after transformations with scoring analysis
- Common improvement patterns and anti-patterns
- Quick self-audit questions
- Templates directory with fillable guides:
- Error message template with multiple formats
- Empty state template for different scenarios
- Onboarding flow template with step-by-step guidance
- MIT License for open source distribution
- Comprehensive README.md positioning the skill strategically
Features
- Model-invoked activation for automatic skill usage
- Progressive disclosure of reference materials
- Scoring framework for objective content evaluation
- Voice and tone adaptation guidance
- Multi-file structure for efficient context loading
---
Future Considerations
Potential additions for future versions:
Reference Materials
- Voice assistant and conversational UI patterns
- Mobile vs. desktop copy considerations
- Industry-specific pattern libraries (fintech, healthcare, e-commerce)
Templates
- Product announcement templates
- Feature release copy templates
- Marketing vs. product copy guidelines
- Email notification templates
Examples
- More industry-specific examples (fintech, healthcare, e-commerce)
- Complex flow examples (multi-step forms, checkout processes)
- Voice variation examples (formal, casual, technical)
- Accessibility improvements
Tools
- Content audit worksheet
- Voice and tone decision tree
- Readability scoring guide
- Translation preparation checklist
---
Note: Version numbers follow semantic versioning:
- Major version (X.0.0): Breaking changes to skill structure or API
- Minor version (0.X.0): New features, templates, or reference materials
- Patch version (0.0.X): Bug fixes, typo corrections, small improvements
Contributing to UX Writing Skill
Thanks for your interest in improving this skill! Contributions are welcome and appreciated.
Ways to Contribute
1. Report Issues
- Found a typo or error? Open an issue
- Unclear instructions? Let us know
- Missing a common pattern? Suggest it
2. Share Examples
- Real-world before/after improvements
- Industry-specific patterns (healthcare, fintech, etc.)
- Unique voice applications
- Edge cases or tricky scenarios
3. Add Templates
- New UI patterns (e.g., chat interfaces, voice assistants)
- Specialized content types (legal, medical, technical)
- Workflow templates
- Evaluation frameworks
4. Improve Documentation
- Clarify existing instructions
- Add more examples to patterns
- Translate to other languages
- Update outdated references
5. Extend Reference Materials
- Accessibility guidelines
- Localization best practices
- Industry-specific standards
- Research citations
For Non-Technical Contributors
New to GitHub? No problem! You don't need to be a developer to contribute. Here are simple ways to share your expertise:
Option 1: Open an Issue
1. Go to the repository on GitHub 2. Click the "Issues" tab at the top 3. Click the green "New issue" button 4. Describe your contribution:
- Paste your suggested text or example
- Explain what it improves or adds
- Include any context that's helpful
5. Click "Submit new issue"
That's it! A maintainer will review and incorporate your contribution.
Option 2: Edit Files Directly on GitHub
You can edit files right in your browser without installing anything:
1. Navigate to the file you want to edit (like examples/real-world-improvements.md) 2. Click the pencil icon (✏️) in the top right corner 3. Make your changes in the editor 4. Scroll down to the "Propose changes" section 5. Write a brief description of what you changed 6. Click "Propose changes" (green button) 7. Click "Create pull request" on the next screen
GitHub will handle the technical parts automatically. A maintainer will review your changes and merge them.
Option 3: Send It Directly
If GitHub feels overwhelming, you can:
- Email your contribution to the maintainer (see README for contact)
- Share a Google Doc with your suggested additions
- Post in community channels where this skill is discussed
Someone will help get your contribution into the repository.
What Makes a Good Contribution?
Whether you're submitting an issue or editing directly:
- Be specific: Instead of "add more examples," share the actual example
- Explain the value: Why is this helpful? What problem does it solve?
- Keep it realistic: Use examples from actual products when possible
- Follow the existing format: Look at similar content and match the style
Don't Worry About Perfection
Submit your idea even if:
- You're not sure about the formatting
- Your example isn't polished yet
- You're uncertain if it fits
Maintainers can help refine it. The hard part is having the expertise — you have that!
Need Help?
Stuck on something? Open an issue with the title "Help: [what you need]" and describe where you're stuck. The community is here to help.
Contribution Guidelines
Content Standards
All contributions should follow these principles:
1. Evidence-based: Based on established UX writing best practices or user research 2. Actionable: Provides clear, practical guidance 3. Concise: Respects the reader's time 4. Well-structured: Easy to scan and reference 5. Example-rich: Shows, doesn't just tell
Style Guidelines
- Use sentence case for headings
- Use em dashes (—) not hyphens (-) for breaks
- Keep examples realistic and specific
- Include both "do" and "don't" examples where helpful
- Score examples against the four quality standards when relevant
File Organization
ux-writing/
├── SKILL.md (core principles and patterns)
├── README.md (GitHub documentation)
├── references/ (supporting materials)
│ ├── voice-chart-template.md
│ ├── content-usability-checklist.md
│ └── patterns-detailed.md
├── examples/ (real-world applications)
│ └── real-world-improvements.md
└── templates/ (fillable guides)
├── error-message-template.md
├── empty-state-template.md
└── onboarding-flow-template.mdAdding New Content
New examples go in examples/
- Show before/after with scoring
- Explain why the improvement works
- Keep consistent with existing format
New templates go in templates/
- Provide clear structure and guidance
- Include checklist for verification
- Show filled examples
New reference materials go in references/
- Comprehensive coverage of topic
- Links to authoritative sources
- Maintains consistent voice
Submitting Changes
1. Fork the repository 2. Create a feature branch (git checkout -b add-chat-pattern) 3. Make your changes following the guidelines above 4. Test the skill — verify Claude can use your additions effectively 5. Update CHANGELOG.md with your changes under "Unreleased" 6. Submit a pull request with clear description of what and why
Pull Request Template
## What does this PR do?
[Brief description of changes]
## Why is this needed?
[Explain the problem this solves or value it adds]
## What type of contribution is this?
- [ ] Bug fix
- [ ] New example
- [ ] New template
- [ ] New reference material
- [ ] Documentation improvement
- [ ] Other (please describe)
## Have you:
- [ ] Tested the skill with your changes?
- [ ] Followed the style guidelines?
- [ ] Updated CHANGELOG.md?
- [ ] Added examples where applicable?
## Additional context
[Any other relevant information]Code of Conduct
Our Standards
- Respectful: Treat all contributors with respect
- Constructive: Provide helpful, actionable feedback
- Inclusive: Welcome contributions from all backgrounds
- Patient: Remember everyone is learning
Unacceptable Behavior
- Harassment or discrimination
- Unconstructive criticism
- Spam or promotional content
- Sharing private information
Questions?
Not sure if your idea fits? Open an issue to discuss before investing time in a full PR.
Recognition
Contributors will be acknowledged in:
- CHANGELOG.md for specific contributions
- README.md for significant additions
- Special recognition for ongoing contributors
License
By contributing, you agree that your contributions will be licensed under the same MIT License that covers this project.
---
Thank you for helping make UX writing more systematic and accessible! 🎉
Using the UX Writing Skill with Figma
Connect this skill to Figma so your agent can review and improve UX copy directly from your designs. Perfect for content designers, product designers, and anyone who needs to audit or enhance UX text in Figma mockups.
What You Can Do
Once connected, you can:
- Share Figma frame links with your agent and get instant UX writing feedback
- Audit existing designs for accessibility, clarity, and tone
- Generate improved copy that follows best practices
- Review entire flows for consistency and voice
- Get specific suggestions based on the four quality standards (purposeful, concise, conversational, clear)
Quick Example
Here's my login screen: [Figma link]
Review all the UX copy using the UX Writing Skill. Check for:
- Accessibility (screen reader compatibility, plain language)
- Error message clarity
- Button labels
- Tone consistencyYour agent will analyze the design, identify all text elements, and provide detailed feedback with specific improvements.
---
Setup: Connect Figma to Your Agent
Choose the setup guide for your agent:
---
Setup: Claude Code
There are two ways to connect Figma to Claude Code. Choose the Remote Server option unless you have specific requirements for the Desktop Server.
Option 1: Remote Server (Recommended)
Best for: Quick setup, working from anywhere, no Figma desktop app needed
Requirements:
- Claude Code installed
- Figma account (Starter, Professional, Organization, or Enterprise plan)
- Internet connection
Step 1: Install Figma MCP
1. Open your terminal 2. Run this command:
claude mcp add --transport http figma https://mcp.figma.com/mcpStep 2: Restart Claude Code
Completely quit Claude Code and reopen it.
Step 3: Authenticate with Figma
1. In Claude Code, type: /mcp 2. Find the "figma-remote-mcp" server 3. If it shows "disconnected", press Enter on that line 4. A browser window will open — click "Allow access"
Step 4: Verify
Ask Claude: Do you have access to Figma?
Claude should confirm the connection and describe what it can do.
---
Option 2: Desktop Server
Best for: Working locally, no internet dependency once set up
Requirements:
- Figma desktop app (latest version)
- Claude Code installed
- Dev Mode access in Figma
Step 1: Enable MCP in Figma Desktop
1. Open the Figma desktop app 2. Open any design file 3. Press Shift + D to switch to Dev Mode 4. In the right panel, scroll to the MCP server section 5. Click "Enable desktop MCP server"
Step 2: Connect Claude Code
claude mcp add --transport http figma-desktop http://127.0.0.1:3845/mcpStep 3: Restart Claude Code and verify with: Do you have access to Figma?
Note: The Figma desktop app must be running with Dev Mode enabled whenever you use this integration.
---
Setup: Codex
Requirements:
- Codex CLI or IDE extension installed
- Figma account
- Internet connection
Step 1: Configure Codex for MCP
Open ~/.codex/config.toml and add:
[features]
rmcp_client = true
[mcp_servers.figma]
url = "https://mcp.figma.com/mcp"Step 2: Install Codex CLI (if not already installed)
npm i -g @openai/codexStep 3: Authenticate with Figma
codex mcp login figmaThis opens a browser window for authentication. Follow the prompts to allow Codex to access your Figma account.
Step 4: Restart your IDE
If using Codex in an IDE, completely restart it to activate the MCP connection.
Step 5: Verify
Paste a Figma Dev Mode section link into Codex and ask it to review the UX copy. Codex should access the frame and respond with feedback.
---
Setup: Cursor
Requirements:
- Cursor installed
- Figma account
- Internet connection
Step 1: Add Figma MCP to Cursor
Open your Cursor MCP configuration (.cursor/mcp.json in your project, or the global config at ~/.cursor/mcp.json) and add:
{
"mcpServers": {
"figma": {
"url": "https://mcp.figma.com/mcp",
"transport": "http"
}
}
}Step 2: Restart Cursor
Completely quit and reopen Cursor.
Step 3: Authenticate with Figma
Open the MCP panel in Cursor settings, find the Figma server, and follow the authentication prompts to connect your Figma account.
Step 4: Verify
Ask Cursor: Do you have access to Figma?
Cursor should confirm the connection.
---
How to Use
Share a Figma Link
Step 1: Get the link
1. Open your design in Figma 2. Select the frame you want to review 3. Right-click and select "Copy link" (or copy the URL from your browser)
- For Codex, use the Dev Mode section link (
Shift + D, then copy the section link)
Step 2: Share with your agent
Review the UX copy in this login screen:
https://www.figma.com/file/abc123/Design?node-id=123-456
Focus on:
- Button labels
- Error messages
- Form field labelsStep 3: Get feedback
Your agent will access the frame, extract all text elements, apply the UX Writing Skill, and provide specific, actionable feedback.
---
Review an Entire Flow
Review all UX copy in this onboarding flow:
https://www.figma.com/file/abc123/Onboarding-Flow
Check for:
- Tone consistency across all screens
- Reading level (target 7th-8th grade)
- Accessibility (screen reader compatibility)
- Button label clarity---
Get Rewritten Copy
Here's my error state: [Figma link]
Rewrite all the copy following UX writing best practices:
- Make it more concise
- Add specific recovery steps
- Ensure screen reader accessibility
- Use empathetic tone---
Example Workflows
1. Design Review (Quick Audit)
I need to review copy in this checkout flow before launch:
[Figma link to checkout screens]
Using the UX Writing Skill, audit for:
- Accessibility issues
- Sentence length (should be under 20 words)
- Button labels (should be specific, not generic)
- Error message clarity
- Consistency across screens
Provide a prioritized list of issues.2. Voice and Tone Check
Review the tone in these empty states:
[Figma link]
Our voice is: helpful, friendly, professional
Check if the copy matches this voice and suggest improvements.
Use the tone adaptation framework from the UX Writing Skill.3. Accessibility Audit
Audit this form for accessibility:
[Figma link to form]
Using accessibility guidelines from the UX Writing Skill, check:
- Screen reader compatibility
- Form labels (visible, not just placeholders)
- Error messages (descriptive, actionable)
- Plain language (7th-8th grade reading level)
- Link text (descriptive, not "click here")4. Before/After Improvements
Here's my current error screen: [Figma link]
Using the UX Writing Skill:
1. Score the current copy against the 4 quality standards
2. Identify specific problems
3. Provide a rewritten version
4. Explain what changed and why5. Cross-Platform Consistency
Compare copy across these three platforms:
- Web: [Figma link 1]
- iOS: [Figma link 2]
- Android: [Figma link 3]
Check for:
- Terminology consistency
- Tone consistency
- Platform-specific conventions (e.g., "tap" vs "click")
- Character count appropriateness for each platform6. Complete UX Audit Workflow
I'm reviewing our checkout flow before launch. Here are the 4 key frames:
1. Cart: [Figma link]
2. Shipping: [Figma link]
3. Payment: [Figma link]
4. Confirmation: [Figma link]
Using the UX Writing Skill, perform a complete audit:
Check for:
- All 4 quality standards (purposeful, concise, conversational, clear)
- Accessibility (screen readers, reading level, plain language)
- Error messages (empathetic, actionable, specific)
- Form labels (visible, descriptive, not placeholder-only)
- Button labels (specific verbs, not generic)
- Voice consistency across all screens
- Appropriate tone for context
Provide:
1. Overall score (1–10) with explanation
2. Critical issues (must fix before launch)
3. Recommended improvements (nice to have)
4. Rewritten copy for any critical issues
5. Summary of patterns used well
Format as a design review report.---
Tips for Best Results
Be Specific About What You Want
❌ Too vague:
"Review this design: [link]"
✅ Better:
"Review the error messages in this form: [link]. Check for accessibility, clarity, and actionable guidance."
Reference Multiple Frames for Context
Review this 3-step onboarding flow:
1. Welcome screen: [link]
2. Account setup: [link]
3. Preferences: [link]
Check for consistent voice and progressive disclosure of information.Ask for Specific Frameworks
Use the tone adaptation framework to suggest appropriate tone for this error state: [link]Score this against the content usability checklist: [link]Explicitly Mention the Skill
For best results, explicitly mention the UX Writing Skill in your prompts — especially in Codex and Cursor:
Using the UX Writing Skill, review this design: [link]In Codex, you can also invoke it directly:
$ux-writing Review the UX copy in this design: [Figma link]Or use the /skills command to select it from the list.
In Cursor, reference it in your prompt:
@ux-writing Review the copy in this design: [Figma link]---
Troubleshooting
"I don't have access to that Figma file"
1. Make sure the file is set to "Anyone with the link can view" 2. Check that you're signed into the same Figma account you authenticated with 3. Try copying the link again — it may have been truncated or expired 4. For Codex, make sure you're using a Dev Mode section link, not just the file URL
MCP server is disconnected
Claude Code: 1. Type /mcp in Claude Code 2. Find the Figma server and press Enter to reconnect 3. Re-authenticate if prompted
Codex: 1. Verify ~/.codex/config.toml has the correct configuration 2. Re-run codex mcp login figma 3. Restart your IDE completely
Cursor: 1. Open Cursor settings and check the MCP panel 2. Reconnect or re-authenticate the Figma server 3. Restart Cursor if needed
"I can't see the MCP server section in Figma"
This applies to the Claude Code Desktop Server option only: 1. Update to the latest Figma desktop app version 2. Make sure you're in Dev Mode (Shift + D) 3. Check that your Figma plan includes Dev Mode access
The skill doesn't seem to activate
Explicitly mention it in your prompt:
Using the UX Writing Skill, review this design: [link]Or ask your agent to apply specific frameworks:
Apply the four quality standards (purposeful, concise, conversational, clear) to this copy: [link]---
Advanced Usage
Create Documentation from Designs
Review all copy in this feature: [link]
Create a content patterns document showing:
- Common patterns we use (buttons, errors, empty states)
- Voice characteristics
- Terminology conventions
- Do/don't examples
Format it as a content style guide section.Build a Voice Chart from Existing Designs
Analyze the copy in these designs: [multiple Figma links]
Using the voice chart template from the UX Writing Skill, create a voice chart showing:
- 3–5 key brand concepts
- Voice characteristics for each
- Do/Don't examples from our actual product
- Tone variations for different contextsGenerate Test Copy
I need placeholder copy for this wireframe: [link]
Generate realistic UX copy for all text elements following our voice:
- Helpful, professional, encouraging
- Target reading level: 8th grade
- Keep button labels under 25 charactersLocalization Prep
Review this design for translation readiness: [link]
Check:
- Text expansion space (German expands 30–40%)
- Idioms or cultural references to avoid
- Hard-coded text in buttons that should be dynamic
- Character limits that might break in other languagesAutomated Copy Testing
Every week, I'll share new designs with you. For each design:
1. Extract all copy
2. Run it through the content usability checklist
3. Flag anything scoring below 7/10
4. Provide specific fixes
5. Track improvements over time---
Resources
- Figma MCP Documentation: developers.figma.com/docs/figma-mcp-server
- UX Writing Skill: See the main README.md for installation and overview
---
Feedback
Have ideas for improving this integration? Open an issue or contribute to the repository. We'd especially love to hear:
- Real-world workflows that work well for your team
- Examples of great UX writing improvements from Figma designs
- Tips for content design teams using this integration
Real-World UX Writing Improvements
This document shows actual UX text transformations with scoring against the four quality standards: Purposeful, Concise, Conversational, and Clear.
E-commerce Checkout Error
Before
"An error has occurred while processing your payment. Please try again later or contact customer support if the problem persists."
Analysis:
- Purposeful: 2/10 — Doesn't help user recover or understand next steps
- Concise: 4/10 — 18 words, vague timeframe ("later")
- Conversational: 4/10 — Robotic system-speak ("an error has occurred")
- Clear: 2/10 — What error? When is "later"? Why did it fail?
Overall: 3/10 — Poor user experience
After
"We couldn't process your payment. Check your card details and try again."
Analysis:
- Purposeful: 9/10 — Provides specific next action
- Concise: 9/10 — 11 words, direct instruction
- Conversational: 9/10 — Natural language ("we couldn't")
- Clear: 9/10 — Specific problem and solution
Overall: 9/10 — Excellent
Why it works: Users know exactly what failed (payment), likely cause (card details), and what to do (check and retry).
---
SaaS Dashboard Empty State
Before
"No data available."
Analysis:
- Purposeful: 2/10 — Doesn't explain why or guide next steps
- Concise: 10/10 — Very brief, but too brief
- Conversational: 5/10 — Cold and unhelpful
- Clear: 3/10 — Technically accurate but not helpful
Overall: 4/10 — Needs significant work
After
"No data yet. Connect your account to see insights."
Analysis:
- Purposeful: 9/10 — Explains state and provides clear CTA
- Concise: 9/10 — 9 words, includes action
- Conversational: 8/10 — Friendly "yet" implies this is temporary
- Clear: 9/10 — Tells you exactly what to do
Overall: 9/10 — Excellent
Why it works: "Yet" creates expectation of future value, CTA is specific and actionable.
---
Mobile App Permission Request
Before
"'AppName' Would Like to Access Your Location" [Allow] [Don't Allow]
Analysis:
- Purposeful: 4/10 — Doesn't explain benefit to user
- Concise: 7/10 — Adequate length but no context
- Conversational: 6/10 — Standard iOS pattern, not particularly engaging
- Clear: 5/10 — Action is clear but reason isn't
Overall: 5/10 — Adequate but could be better
After
"Enable location to find coffee shops near you" [Allow] [Not now]
Analysis:
- Purposeful: 9/10 — Clear user benefit (find shops)
- Concise: 8/10 — 7 words with value proposition
- Conversational: 9/10 — Direct, benefit-focused
- Clear: 9/10 — Exact benefit stated upfront
Overall: 9/10 — Excellent
Why it works: Leads with user benefit, not system need. "Not now" is less final than "Don't Allow."
---
Account Deletion Confirmation
Before
"Are you sure you want to delete your account? This action cannot be undone. All your data will be permanently deleted."
Analysis:
- Purposeful: 6/10 — Warns of consequences but feels heavy-handed
- Concise: 5/10 — 19 words, some redundancy ("permanently deleted")
- Conversational: 5/10 — Somewhat robotic multiple sentences
- Clear: 7/10 — Consequences are clear
Overall: 6/10 — Adequate but could be improved
After
"Delete your account? You'll lose all your data and this can't be undone."
Analysis:
- Purposeful: 8/10 — Clear warning without being preachy
- Concise: 9/10 — 13 words, no redundancy
- Conversational: 9/10 — Natural phrasing, contraction
- Clear: 9/10 — Consequences clearly stated
Overall: 9/10 — Excellent
Why it works: Question format engages user, contractions feel human, consequences clear without repetition.
---
Password Requirements
Before
"Password must contain at least 8 characters including uppercase letters, lowercase letters, numbers and special characters."
Analysis:
- Purposeful: 7/10 — Provides requirements but hard to scan
- Concise: 4/10 — 17 words in one dense sentence
- Conversational: 5/10 — List reads like technical documentation
- Clear: 6/10 — Complete info but overwhelming format
Overall: 5/10 — Adequate but not optimal
After
"Create a strong password (8+ characters) Use a mix of letters, numbers, and symbols"
Analysis:
- Purposeful: 8/10 — Explains why (strong) and what
- Concise: 9/10 — 14 words, broken into scannable lines
- Conversational: 9/10 — "Create" vs "must contain"
- Clear: 9/10 — Easy to scan and understand
Overall: 9/10 — Excellent
Why it works: Two short lines easier to scan, "strong password" explains purpose, active voice.
---
Newsletter Unsubscribe Confirmation
Before
"You have been successfully unsubscribed from our mailing list. You will no longer receive emails from us. Thank you for your participation."
Analysis:
- Purposeful: 4/10 — Overly formal for someone leaving
- Concise: 3/10 — 23 words, lots of redundancy
- Conversational: 3/10 — Corporate, stiff
- Clear: 7/10 — Message is clear but verbose
Overall: 4/10 — Needs work
After
"You're unsubscribed. You can resubscribe anytime in your settings."
Analysis:
- Purposeful: 9/10 — Confirms action, offers easy reversal
- Concise: 10/10 — 9 words, direct
- Conversational: 10/10 — Casual, respectful
- Clear: 9/10 — Simple and actionable
Overall: 9/10 — Excellent
Why it works: Respects user's decision, provides exit ramp without guilt, uses contraction.
---
File Upload Progress
Before
"File uploading... Please wait."
Analysis:
- Purposeful: 5/10 — Shows status but no time estimate
- Concise: 8/10 — Very brief
- Conversational: 5/10 — Somewhat robotic
- Clear: 6/10 — Basic info only
Overall: 6/10 — Adequate
After
"Uploading report.pdf... Almost done"
Analysis:
- Purposeful: 8/10 — Shows filename and reassuring progress
- Concise: 8/10 — 4 words plus filename
- Conversational: 9/10 — Encouraging "almost done"
- Clear: 9/10 — Specific file being uploaded
Overall: 8/10 — Good
Why it works: Filename confirms right file is uploading, "almost done" reduces anxiety.
---
Common Patterns Across These Improvements
1. Lead with specifics, not generics — "We couldn't process your payment" vs "An error occurred" 2. Show user benefit before system need — "Find coffee shops" before "access location" 3. Use contractions — "You're" feels human, "You are" feels robotic 4. Break dense text into scannable chunks — Two short lines beat one long sentence 5. Remove redundancy — "Permanently deleted" → "can't be undone" 6. Use active voice — "Create a password" vs "Password must contain" 7. Provide recovery paths — Always tell users what to do next 8. Respect user decisions — Don't guilt-trip people who opt out
Quick Self-Audit Questions
Use these to improve any UX text:
1. Can I remove any words without losing meaning? 2. Does this explain what the user needs to know right now? 3. Would I actually say this out loud to a friend? 4. Is there a specific verb I could use instead of a generic one? 5. Am I showing value before asking for something?
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="description" content="A comprehensive UX Writing Skill for Claude and Codex. Write accessible, user-centered interface copy with research-backed best practices.">
<title>UX Writing Skill for Claude & Codex</title>
<link rel="preconnect" href="https://fonts.googleapis.com">
<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>
<link href="https://fonts.googleapis.com/css2?family=Source+Serif+4:ital,opsz,wght@0,8..60,300;0,8..60,400;0,8..60,600;0,8..60,700;1,8..60,300;1,8..60,400&display=swap" rel="stylesheet">
<style>
* {
margin: 0;
padding: 0;
box-sizing: border-box;
}
:root {
--cream: #FAF8EE;
--ink: #1a1614;
--ink-light: #4a4540;
--ink-muted: #8a857f;
--accent: #BACDD9;
--accent-dark: #9ab5c4;
--border: rgba(26, 22, 20, 0.08);
--border-dark: rgba(26, 22, 20, 0.15);
}
body {
font-family: 'Source Serif 4', Georgia, serif;
line-height: 1.75;
color: var(--ink);
background: var(--cream);
font-size: 18px;
font-weight: 400;
-webkit-font-smoothing: antialiased;
-moz-osx-font-smoothing: grayscale;
position: relative;
}
/* Background pattern - subtle dots */
body::before {
content: '·';
position: fixed;
top: 0;
left: 0;
right: 0;
bottom: 0;
pointer-events: none;
z-index: 0;
font-size: 20px;
line-height: 40px;
letter-spacing: 40px;
color: var(--ink);
opacity: 0.06;
overflow: hidden;
white-space: pre;
word-wrap: break-word;
}
.container {
max-width: 1200px;
margin: 0 auto;
padding: 0 40px;
position: relative;
z-index: 1;
}
main {
position: relative;
z-index: 1;
}
/* Header */
header {
padding: 20px 0;
border-bottom: 1px solid var(--border);
position: sticky;
top: 0;
background: var(--cream);
z-index: 100;
backdrop-filter: blur(10px);
}
header .container {
display: flex;
justify-content: space-between;
align-items: center;
}
header h1 {
font-size: 15px;
font-weight: 400;
letter-spacing: 0.3px;
text-transform: uppercase;
color: var(--ink);
}
header nav {
display: flex;
gap: 8px;
}
header nav a {
color: var(--ink-light);
text-decoration: none;
font-size: 14px;
font-weight: 400;
transition: all 0.2s ease;
letter-spacing: 0.2px;
padding: 8px 16px;
border-radius: 6px;
background: transparent;
}
header nav a:hover {
color: var(--ink);
background: rgba(186, 205, 217, 0.15);
}
.terminal-trigger {
color: var(--ink-light);
text-decoration: none;
font-size: 14px;
font-weight: 400;
transition: all 0.2s ease;
letter-spacing: 0.2px;
padding: 8px 16px;
border-radius: 6px;
background: transparent;
border: none;
cursor: pointer;
font-family: 'Courier New', monospace;
}
.terminal-trigger:hover {
color: var(--ink);
background: rgba(186, 205, 217, 0.15);
}
.video-trigger {
color: var(--ink-light);
text-decoration: none;
font-size: 14px;
font-weight: 400;
transition: all 0.2s ease;
letter-spacing: 0.2px;
padding: 8px 16px;
border-radius: 6px;
background: transparent;
border: none;
cursor: pointer;
font-family: 'Courier New', monospace;
}
.video-trigger:hover {
color: var(--ink);
background: rgba(186, 205, 217, 0.15);
}
/* Hero */
.hero {
padding: 160px 0 200px;
text-align: center;
}
.hero h2 {
font-size: clamp(48px, 7vw, 96px);
font-weight: 300;
line-height: 1.1;
margin-bottom: 40px;
color: var(--ink);
letter-spacing: -0.02em;
max-width: 900px;
margin-left: auto;
margin-right: auto;
}
.hero .subtitle {
font-size: clamp(20px, 2.5vw, 28px);
color: var(--ink-light);
margin-bottom: 80px;
max-width: 700px;
margin-left: auto;
margin-right: auto;
line-height: 1.6;
font-weight: 300;
}
.cta-buttons {
display: flex;
gap: 24px;
justify-content: center;
flex-wrap: wrap;
}
.btn {
padding: 20px 48px;
text-decoration: none;
font-size: 16px;
font-weight: 400;
letter-spacing: 0.5px;
text-transform: uppercase;
transition: all 0.3s ease;
border: 1px solid var(--border-dark);
display: inline-block;
}
.btn-primary {
background: var(--ink);
color: var(--cream);
border-color: var(--ink);
}
.btn-primary:hover {
background: var(--ink-light);
border-color: var(--ink-light);
transform: translate3d(0, -2px, 0);
box-shadow: 0 8px 24px rgba(26, 22, 20, 0.15);
backface-visibility: hidden;
-webkit-font-smoothing: subpixel-antialiased;
}
.btn-secondary {
background: transparent;
color: var(--ink);
}
.btn-secondary:hover {
background: var(--ink);
color: var(--cream);
transform: translate3d(0, -2px, 0);
backface-visibility: hidden;
-webkit-font-smoothing: subpixel-antialiased;
}
/* Stats */
.stats {
padding: 120px 0;
border-top: 1px solid var(--border);
border-bottom: 1px solid var(--border);
}
.stats-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
gap: 80px;
text-align: center;
}
.stat-number {
font-size: 72px;
font-weight: 300;
color: var(--ink);
margin-bottom: 16px;
line-height: 1;
letter-spacing: -0.02em;
}
.stat-label {
font-size: 14px;
color: var(--ink-muted);
text-transform: uppercase;
letter-spacing: 1px;
font-weight: 400;
}
/* Features */
.features {
padding: 160px 0;
}
.section-title {
font-size: clamp(36px, 5vw, 64px);
font-weight: 300;
text-align: center;
margin-bottom: 120px;
letter-spacing: -0.02em;
color: var(--ink);
}
.feature-grid {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(320px, 1fr));
gap: 80px;
}
.feature-card {
padding: 0;
}
.feature-card h4 {
font-size: 24px;
font-weight: 400;
margin-bottom: 24px;
color: var(--ink);
letter-spacing: -0.01em;
}
.feature-card p {
color: var(--ink-light);
font-size: 18px;
line-height: 1.8;
margin-bottom: 32px;
}
.feature-card ul {
list-style: none;
}
.feature-card li {
color: var(--ink-light);
font-size: 16px;
padding: 12px 0 12px 32px;
position: relative;
line-height: 1.6;
border-bottom: 1px solid var(--border);
transition: color 0.3s ease;
}
.feature-card li:last-child {
border-bottom: none;
}
.feature-card li:before {
content: "—";
position: absolute;
left: 8px;
color: var(--accent);
font-weight: 400;
width: 16px;
text-align: left;
}
/* Integrations */
.integrations {
padding: 160px 0;
border-top: 1px solid var(--border);
}
.integrations .section-title {
margin-bottom: 40px;
}
.integrations .intro {
text-align: center;
color: var(--ink-light);
font-size: 20px;
margin-bottom: 80px;
max-width: 700px;
margin-left: auto;
margin-right: auto;
line-height: 1.7;
}
.integration-card {
background: rgba(212, 165, 116, 0.06);
border: 1px solid var(--border);
padding: 80px;
max-width: 800px;
margin: 0 auto;
}
.integration-card h4 {
font-size: 20px;
font-weight: 400;
margin-bottom: 32px;
text-transform: uppercase;
letter-spacing: 1px;
color: var(--ink-muted);
}
.integration-card code {
background: var(--ink);
color: var(--accent);
padding: 32px;
display: block;
margin: 32px 0;
font-size: 15px;
font-family: 'SF Mono', Monaco, 'Courier New', monospace;
overflow-x: auto;
line-height: 1.6;
border: 1px solid var(--ink);
}
.integration-card .help-text {
margin-top: 32px;
color: var(--ink-light);
font-size: 17px;
line-height: 1.7;
}
.integration-card .guide-link {
margin-top: 32px;
display: inline-block;
}
.integration-card .guide-link a {
color: var(--ink);
text-decoration: none;
font-weight: 400;
border-bottom: 1px solid var(--accent);
padding-bottom: 2px;
transition: border-color 0.3s ease;
}
.integration-card .guide-link a:hover {
border-color: var(--ink);
}
/* Quick Start */
.quickstart {
padding: 160px 0;
}
.steps {
display: grid;
grid-template-columns: repeat(auto-fit, minmax(280px, 1fr));
gap: 80px;
margin-bottom: 80px;
}
.step {
text-align: left;
padding: 48px 0;
border-top: 1px solid var(--border-dark);
}
.step-number {
font-size: 14px;
font-weight: 400;
color: var(--ink-muted);
margin-bottom: 24px;
text-transform: uppercase;
letter-spacing: 1px;
}
.step h4 {
font-size: 28px;
font-weight: 400;
margin-bottom: 20px;
color: var(--ink);
letter-spacing: -0.01em;
}
.step p {
color: var(--ink-light);
font-size: 17px;
line-height: 1.7;
}
.quickstart-cta {
text-align: center;
margin-top: 80px;
}
/* Footer */
footer {
border-top: 1px solid var(--border);
padding: 40px 0;
margin-top: 160px;
}
footer .container {
display: flex;
justify-content: space-between;
align-items: center;
flex-wrap: wrap;
gap: 20px;
}
footer p {
color: var(--ink-muted);
font-size: 14px;
}
footer p a {
color: var(--ink-light);
text-decoration: none;
transition: all 0.2s ease;
padding: 4px 8px;
border-radius: 4px;
}
footer p a:hover {
color: var(--ink);
background: rgba(186, 205, 217, 0.15);
}
footer nav {
display: flex;
gap: 8px;
}
footer nav a {
color: var(--ink-light);
text-decoration: none;
font-size: 14px;
font-weight: 400;
transition: all 0.2s ease;
padding: 8px 16px;
border-radius: 6px;
background: transparent;
}
footer nav a:hover {
color: var(--ink);
background: rgba(186, 205, 217, 0.15);
}
/* Animations */
@keyframes fadeInUp {
from {
opacity: 0;
transform: translateY(30px);
}
to {
opacity: 1;
transform: translateY(0);
}
}
.hero h2,
.hero .subtitle,
.cta-buttons {
animation: fadeInUp 0.8s ease-out forwards;
opacity: 0;
}
.hero .subtitle {
animation-delay: 0.2s;
}
.cta-buttons {
animation-delay: 0.4s;
}
/* Responsive */
@media (max-width: 768px) {
.container {
padding: 0 24px;
}
header {
padding: 40px 0;
}
header nav {
gap: 24px;
}
header nav a {
font-size: 14px;
}
.hero {
padding: 100px 0 120px;
}
.hero .subtitle {
margin-bottom: 60px;
}
.stats {
padding: 80px 0;
}
.stats-grid {
gap: 60px;
}
.features {
padding: 100px 0;
}
.section-title {
margin-bottom: 80px;
}
.feature-grid {
gap: 60px;
}
.integrations {
padding: 100px 0;
}
.integration-card {
padding: 40px;
}
.quickstart {
padding: 100px 0;
}
.steps {
gap: 60px;
}
footer {
padding: 60px 0;
margin-top: 100px;
}
footer .container {
flex-direction: column;
text-align: center;
}
footer nav {
flex-direction: column;
gap: 20px;
}
}
/* Refined details */
::selection {
background: #BACDD9;
color: var(--ink);
}
a {
position: relative;
cursor: pointer;
}
.feature-card li:hover {
color: var(--ink);
}
/* Terminal Window */
.terminal-window {
position: fixed;
width: 600px;
height: 500px;
background: #1a1614;
border: 1px solid var(--border-dark);
border-radius: 8px;
box-shadow: 0 20px 60px rgba(26, 22, 20, 0.3);
overflow: hidden;
z-index: 1000;
display: flex;
flex-direction: column;
}
.terminal-header {
padding: 12px 16px;
background: #141413;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
cursor: grab;
display: flex;
justify-content: space-between;
align-items: center;
user-select: none;
}
.terminal-header:active {
cursor: grabbing;
}
.terminal-title {
font-size: 12px;
font-weight: 400;
color: rgba(255, 255, 255, 0.6);
letter-spacing: 0.3px;
font-family: 'Courier New', monospace;
}
.terminal-controls {
display: flex;
gap: 8px;
}
.terminal-control {
width: 12px;
height: 12px;
border-radius: 50%;
border: none;
cursor: pointer;
}
.terminal-control.close {
background: #ff5f56;
position: relative;
transition: all 0.2s ease;
}
.terminal-control.close::before {
content: '×';
position: absolute;
top: 50%;
left: 50%;
transform: translate(-50%, -50%);
font-size: 10px;
color: #4a0a07;
opacity: 0;
transition: opacity 0.2s ease;
font-weight: 700;
line-height: 1;
}
.terminal-control.close:hover::before {
opacity: 1;
}
.terminal-control.minimize {
background: #ffbd2e;
}
.terminal-control.maximize {
background: #27c93f;
}
.terminal-content {
flex: 1;
overflow-y: auto;
padding: 20px;
background: #1a1614;
font-family: 'Courier New', monospace;
font-size: 13px;
line-height: 1.6;
color: #faf8ee;
}
.terminal-line {
margin-bottom: 8px;
opacity: 0;
animation: fadeInLine 0.3s ease-out forwards;
}
@keyframes fadeInLine {
from {
opacity: 0;
}
to {
opacity: 1;
}
}
.terminal-prompt {
color: #BACDD9;
}
.terminal-command {
color: #faf8ee;
}
.terminal-output {
color: #b0aea5;
}
.terminal-success {
color: #788c5d;
}
.terminal-highlight {
color: #BACDD9;
font-weight: 600;
}
/* Video Modal Window */
.video-window {
position: fixed;
width: 800px;
height: 500px;
background: #1a1614;
border: 1px solid var(--border-dark);
border-radius: 8px;
box-shadow: 0 20px 60px rgba(26, 22, 20, 0.3);
overflow: hidden;
z-index: 1000;
display: flex;
flex-direction: column;
}
.video-header {
padding: 12px 16px;
background: #141413;
border-bottom: 1px solid rgba(255, 255, 255, 0.1);
cursor: grab;
display: flex;
justify-content: space-between;
align-items: center;
user-select: none;
}
.video-header:active {
cursor: grabbing;
}
.video-title {
font-size: 12px;
font-weight: 400;
color: rgba(255, 255, 255, 0.6);
letter-spacing: 0.3px;
font-family: 'Courier New', monospace;
}
.video-content {
position: relative;
width: 100%;
flex: 1;
background: #1a1614;
overflow: hidden;
}
.video-content video {
width: 100%;
height: 100%;
object-fit: contain;
border: none;
}
@media (max-width: 768px) {
.video-window {
width: 90vw;
}
}
@media (max-width: 768px) {
.terminal-window {
width: 90vw;
max-height: 70vh;
}
header nav {
gap: 4px;
}
header nav a,
.terminal-trigger,
.video-trigger {
padding: 6px 12px;
font-size: 13px;
}
}
</style>
</head>
<body>
<header>
<div class="container">
<h1>UX WRITING SKILL</h1>
<nav>
<a href="https://github.com/content-designer/ux-writing-skill">Repository</a>
<a href="https://github.com/content-designer/ux-writing-skill/blob/main/docs/figma-integration.md">Figma</a>
<a href="https://github.com/content-designer/ux-writing-skill#usage-examples">Documentation</a>
<button class="video-trigger" onclick="toggleVideo()">▷</button>
<button class="terminal-trigger" onclick="toggleTerminal()">></button>
</nav>
</div>
</header>
<main>
<section class="hero">
<div class="container">
<h2>Write better<br>interface copy</h2>
<p class="subtitle">A comprehensive agent skill for Claude, Codex, and Cursor that helps content designers and product teams create accessible, user-centered text following research-backed best practices.</p>
<div class="cta-buttons">
<a href="https://github.com/content-designer/ux-writing-skill/raw/main/dist/ux-writing-skill.zip" class="btn btn-primary">Download skill</a>
<a href="https://github.com/content-designer/ux-writing-skill" class="btn btn-secondary">View on GitHub</a>
</div>
</div>
</section>
<section class="stats">
<div class="container">
<div class="stats-grid">
<div class="stat">
<div class="stat-number">25+</div>
<div class="stat-label">Pages of guidance</div>
</div>
<div class="stat">
<div class="stat-number">40+</div>
<div class="stat-label">UI patterns</div>
</div>
<div class="stat">
<div class="stat-number">8</div>
<div class="stat-label">Fillable templates</div>
</div>
<div class="stat">
<div class="stat-number">Free</div>
<div class="stat-label">Open source</div>
</div>
</div>
</div>
</section>
<section class="features">
<div class="container">
<h3 class="section-title">What's included</h3>
<div class="feature-grid">
<div class="feature-card">
<h4>Accessibility guidelines</h4>
<p>Comprehensive guidance for writing inclusive UX text that works for everyone.</p>
<ul>
<li>Screen reader optimization</li>
<li>Cognitive accessibility</li>
<li>WCAG compliance</li>
<li>Multi-modal communication</li>
</ul>
</div>
<div class="feature-card">
<h4>Research-backed metrics</h4>
<p>Quantifiable benchmarks based on comprehension research and industry standards.</p>
<ul>
<li>Sentence length targets</li>
<li>Comprehension rates</li>
<li>Reading level guidelines</li>
<li>Character limits by type</li>
</ul>
</div>
<div class="feature-card">
<h4>Expanded error patterns</h4>
<p>Four distinct error types with clear timing, location, and recovery guidance.</p>
<ul>
<li>Validation errors</li>
<li>System errors</li>
<li>Blocking errors</li>
<li>Permission errors</li>
</ul>
</div>
<div class="feature-card">
<h4>Tone adaptation framework</h4>
<p>Map user emotional states to appropriate tone while maintaining consistent voice.</p>
<ul>
<li>By emotional state</li>
<li>By content type</li>
<li>Context-specific examples</li>
<li>Voice chart templates</li>
</ul>
</div>
<div class="feature-card">
<h4>Real-world examples</h4>
<p>Before/after improvements with detailed scoring against our quality standards.</p>
<ul>
<li>E-commerce patterns</li>
<li>SaaS applications</li>
<li>Mobile experiences</li>
<li>Common anti-patterns</li>
</ul>
</div>
<div class="feature-card">
<h4>Fillable templates</h4>
<p>Practical guides and frameworks for creating consistent, high-quality UX text.</p>
<ul>
<li>Error message templates</li>
<li>Empty state guides</li>
<li>Onboarding flows</li>
<li>Voice charts</li>
</ul>
</div>
</div>
</div>
</section>
<section class="integrations">
<div class="container">
<h3 class="section-title">Figma integration</h3>
<p class="intro">Review and improve UX copy directly from your Figma designs. Works with Claude Code, Codex, and Cursor. Perfect for content designers and product teams.</p>
<div class="feature-grid" style="margin-bottom: 0;">
<div class="integration-card" style="background: rgba(186, 205, 217, 0.08); border: 1px solid var(--border); padding: 48px;">
<h4>Any agent + Figma MCP</h4>
<code>npx skills add content-designer/ux-writing-skill</code>
<p class="help-text">Share any Figma frame link with your agent to get instant UX writing feedback, accessibility audits, and specific improvements. Setup instructions available for Claude Code, Codex, and Cursor.</p>
<p class="guide-link"><a href="https://github.com/content-designer/ux-writing-skill/blob/main/docs/figma-integration.md">Read the Figma setup guide →</a></p>
</div>
</div>
</div>
</section>
<section class="quickstart">
<div class="container">
<h3 class="section-title">Get started</h3>
<div class="steps">
<div class="step">
<div class="step-number">Step 1</div>
<h4>Download</h4>
<p>Download <strong>ux-writing-skill.zip</strong> — contains the skill file and all supporting documentation for Claude and Codex.</p>
</div>
<div class="step">
<div class="step-number">Step 2 — Claude</div>
<h4>Install in Claude Desktop</h4>
<p>Open <strong>Settings → Capabilities → Skills</strong>, click <strong>Upload skill</strong>, and select the ZIP file directly (no extraction needed).</p>
</div>
<div class="step">
<div class="step-number">Step 2 — Codex</div>
<h4>Install in Codex</h4>
<p>Extract the ZIP and copy to <strong>~/.codex/skills/</strong> (Mac/Linux) or <strong>%USERPROFILE%\.codex\skills\</strong> (Windows), then restart Codex or your IDE.</p>
</div>
<div class="step">
<div class="step-number">Step 3</div>
<h4>Use</h4>
<p>Ask your AI assistant to review any interface copy and it will automatically apply UX writing best practices.</p>
</div>
</div>
<div class="quickstart-cta">
<a href="https://github.com/content-designer/ux-writing-skill#installation" class="btn btn-secondary">View detailed instructions</a>
</div>
</div>
</section>
</main>
<footer>
<div class="container">
<p>Built by <a href="https://www.linkedin.com/in/christopher-greer/">Christopher Greer</a> · MIT License</p>
<nav>
<a href="https://github.com/content-designer/ux-writing-skill/blob/main/CONTRIBUTING.md">Contributing</a>
<a href="https://github.com/content-designer/ux-writing-skill/blob/main/CHANGELOG.md">Changelog</a>
<a href="https://github.com/content-designer/ux-writing-skill/issues">Issues</a>
</nav>
</div>
</footer>
<!-- Terminal Window -->
<div class="terminal-window" id="terminal-window" style="top: 100px; left: 100px; display: none;">
<div class="terminal-header" id="terminal-header">
<div class="terminal-title">ux-writing-skill — demo</div>
<div class="terminal-controls">
<button class="terminal-control close" onclick="closeTerminal()"></button>
</div>
</div>
<div class="terminal-content" id="terminal-content">
<div class="terminal-line"><span class="terminal-prompt">→</span> <span class="terminal-command">Review this empty state message</span></div>
<div class="terminal-line"><span class="terminal-output">"You don't have any saved items."</span></div>
<div class="terminal-line"> </div>
<div class="terminal-line"><span class="terminal-success">✓ Analyzing against 4 quality standards</span></div>
<div class="terminal-line"> </div>
<div class="terminal-line"><span class="terminal-highlight">Evaluation:</span></div>
<div class="terminal-line"><span class="terminal-output">✗ Purposeful: Doesn't help user take action or achieve goals</span></div>
<div class="terminal-line"><span class="terminal-output">✓ Concise: Word count is appropriate (6 words)</span></div>
<div class="terminal-line"><span class="terminal-output">✗ Conversational: Negative framing, sounds discouraging</span></div>
<div class="terminal-line"><span class="terminal-output">✓ Clear: Message is unambiguous</span></div>
<div class="terminal-line"> </div>
<div class="terminal-line"><span class="terminal-highlight">Issues:</span></div>
<div class="terminal-line"><span class="terminal-output">• Missing call-to-action to populate the empty state</span></div>
<div class="terminal-line"><span class="terminal-output">• Negative framing ("don't have") instead of neutral/positive</span></div>
<div class="terminal-line"><span class="terminal-output">• No guidance on what to do next</span></div>
<div class="terminal-line"> </div>
<div class="terminal-line"><span class="terminal-highlight">Recommended:</span></div>
<div class="terminal-line"><span class="terminal-output">"No saved items yet. Browse products to start building your list."</span></div>
<div class="terminal-line"> </div>
<div class="terminal-line"><span class="terminal-highlight">Why this works:</span></div>
<div class="terminal-line"><span class="terminal-output">• Purposeful: Clear CTA guides user to next action</span></div>
<div class="terminal-line"><span class="terminal-output">• Conversational: "yet" implies this is temporary and expected</span></div>
<div class="terminal-line"><span class="terminal-output">• Follows empty state pattern: Explanation + CTA</span></div>
<div class="terminal-line"> </div>
<div class="terminal-line"><span class="terminal-prompt">→</span> <span class="terminal-command">_</span></div>
</div>
</div>
<!-- Video Window -->
<div class="video-window" id="video-window" style="top: 100px; left: 100px; display: none;">
<div class="video-header" id="video-header">
<div class="video-title">demo — ux-writing-skill</div>
<div class="terminal-controls">
<button class="terminal-control close" onclick="closeVideo()"></button>
</div>
</div>
<div class="video-content">
<video controls>
<source src="https://raw.githubusercontent.com/content-designer/ux-writing-skill/main/ux-writing-skill-vid.mp4" type="video/mp4">
Your browser does not support the video tag.
</video>
</div>
</div>
<script>
// Draggable terminal window
let isDragging = false;
let currentX;
let currentY;
let initialX;
let initialY;
let xOffset = 0;
let yOffset = 0;
const terminalWindow = document.getElementById('terminal-window');
const terminalHeader = document.getElementById('terminal-header');
terminalHeader.addEventListener('mousedown', dragStart);
document.addEventListener('mousemove', drag);
document.addEventListener('mouseup', dragEnd);
// Touch events for mobile
terminalHeader.addEventListener('touchstart', dragStart);
document.addEventListener('touchmove', drag);
document.addEventListener('touchend', dragEnd);
function dragStart(e) {
// Don't start dragging if clicking on terminal control
if (e.target.classList.contains('terminal-control')) {
return;
}
if (e.type === 'touchstart') {
initialX = e.touches[0].clientX - xOffset;
initialY = e.touches[0].clientY - yOffset;
} else {
initialX = e.clientX - xOffset;
initialY = e.clientY - yOffset;
}
if (e.target === terminalHeader || terminalHeader.contains(e.target)) {
isDragging = true;
}
}
function drag(e) {
if (isDragging) {
e.preventDefault();
if (e.type === 'touchmove') {
currentX = e.touches[0].clientX - initialX;
currentY = e.touches[0].clientY - initialY;
} else {
currentX = e.clientX - initialX;
currentY = e.clientY - initialY;
}
xOffset = currentX;
yOffset = currentY;
setTranslate(currentX, currentY, terminalWindow);
}
}
function dragEnd(e) {
initialX = currentX;
initialY = currentY;
isDragging = false;
}
function setTranslate(xPos, yPos, el) {
el.style.transform = `translate(${xPos}px, ${yPos}px)`;
}
function toggleTerminal() {
const isHidden = terminalWindow.style.display === 'none';
terminalWindow.style.display = isHidden ? 'flex' : 'none';
if (isHidden) {
// Add staggered typing animation
const lines = document.querySelectorAll('.terminal-line');
lines.forEach((line, index) => {
line.style.animationDelay = `${index * 0.15}s`;
});
}
}
function closeTerminal() {
terminalWindow.style.display = 'none';
}
// Draggable video window
let isVideoDragging = false;
let videoCurrentX;
let videoCurrentY;
let videoInitialX;
let videoInitialY;
let videoXOffset = 0;
let videoYOffset = 0;
const videoWindow = document.getElementById('video-window');
const videoHeader = document.getElementById('video-header');
videoHeader.addEventListener('mousedown', videoDragStart);
document.addEventListener('mousemove', videoDrag);
document.addEventListener('mouseup', videoDragEnd);
// Touch events for mobile
videoHeader.addEventListener('touchstart', videoDragStart);
document.addEventListener('touchmove', videoDrag);
document.addEventListener('touchend', videoDragEnd);
function videoDragStart(e) {
// Don't start dragging if clicking on terminal control
if (e.target.classList.contains('terminal-control')) {
return;
}
if (e.type === 'touchstart') {
videoInitialX = e.touches[0].clientX - videoXOffset;
videoInitialY = e.touches[0].clientY - videoYOffset;
} else {
videoInitialX = e.clientX - videoXOffset;
videoInitialY = e.clientY - videoYOffset;
}
if (e.target === videoHeader || videoHeader.contains(e.target)) {
isVideoDragging = true;
}
}
function videoDrag(e) {
if (isVideoDragging) {
e.preventDefault();
if (e.type === 'touchmove') {
videoCurrentX = e.touches[0].clientX - videoInitialX;
videoCurrentY = e.touches[0].clientY - videoInitialY;
} else {
videoCurrentX = e.clientX - videoInitialX;
videoCurrentY = e.clientY - videoInitialY;
}
videoXOffset = videoCurrentX;
videoYOffset = videoCurrentY;
setVideoTranslate(videoCurrentX, videoCurrentY, videoWindow);
}
}
function videoDragEnd(e) {
videoInitialX = videoCurrentX;
videoInitialY = videoCurrentY;
isVideoDragging = false;
}
function setVideoTranslate(xPos, yPos, el) {
el.style.transform = `translate(${xPos}px, ${yPos}px)`;
}
function toggleVideo() {
const isHidden = videoWindow.style.display === 'none';
videoWindow.style.display = isHidden ? 'flex' : 'none';
}
function closeVideo() {
const video = videoWindow.querySelector('video');
if (video) {
video.pause();
video.currentTime = 0;
}
videoWindow.style.display = 'none';
}
</script>
</body>
</html>
MIT License
Copyright (c) 2026 Christopher Greer
Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
in the Software without restriction, including without limitation the rights
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
copies of the Software, and to permit persons to whom the Software is
furnished to do so, subject to the following conditions:
The above copyright notice and this permission notice shall be included in all
copies or substantial portions of the Software.
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
SOFTWARE.
Agent Skill for UX Writing
Scale content quality through AI-powered design system enforcement
🌐 [View website](https://content-designer.github.io/ux-writing-skill/) 📄 [Read docs](https://content-designer-ux-writing-skill-26.mintlify.app/introduction)
An agent skill that enables Claude, Codex, and Cursor to write and edit user-centered interface copy (UX text/microcopy) for digital products. This skill transforms AI assistants into specialized UX writing tools that apply consistent standards, patterns, and voice across your product.
The Problem
Design systems solve visual consistency, but content quality still depends on individual writers. Every error message, button label, and empty state requires manual review to ensure it's clear, concise, conversational, and purposeful. This doesn't scale.
The Solution
This agent skill packages UX writing expertise into a system your agent can apply automatically. Instead of asking "make this better," you can rely on consistent, evidence-based improvements across your entire product interface.
What Makes This Different
Systems thinking, not style guides: This isn't a list of writing tips. It's a framework for evaluating and improving UX text based on four measurable quality standards.
Progressive disclosure: Reference materials are loaded only when needed, keeping Claude's context efficient while providing deep expertise on demand.
Proven patterns: Built from real-world UX writing best practices, with examples across different product voices and contexts.
Immediately actionable: Every pattern includes concrete before/after examples and scoring against quality standards.
What You Get
Core Framework
- Four quality standards: Purposeful, Concise, Conversational, Clear
- Common UX patterns: Buttons, errors, empty states, forms, notifications, onboarding
- Editing process: Systematic approach to improving any interface text
- Voice and tone guidance: Adapt content to brand personality and context
- Accessibility guidelines: Write for screen readers, cognitive accessibility, and WCAG compliance
- Research-backed benchmarks: Sentence length targets, comprehension rates, reading levels
Reference Materials
- Accessibility guidelines: Comprehensive guide for writing inclusive, accessible UX text
- Voice chart template: Establish consistent brand personality
- Content usability checklist: Evaluate text quality with scoring framework
- Detailed pattern examples: See how different voices apply the same patterns
Practical Tools
- Real-world improvements: Before/after transformations with analysis
- Fillable templates: Error messages, empty states, onboarding flows
- Expanded error patterns: Validation, system, blocking, and permission errors with examples
- Tone adaptation framework: Map emotional states to appropriate tone
- Quick reference: Common patterns and anti-patterns
Use Cases
For content designers: Apply consistent UX writing standards across your product without memorizing every rule.
For product teams: Enable non-writers to create interface copy that follows your design system.
For design system teams: Enforce content guidelines at scale without becoming a bottleneck.
For early-stage products: Build content quality in from the start with proven patterns.
Installation
What You Need
This skill works with Claude Desktop, Claude Code, Codex (CLI and IDE extensions), and Cursor. Install it with the skills CLI — no manual download or file copying required.
Note: This skill works with Codex CLI/IDE, not ChatGPT. ChatGPT cannot install or use skills.
Install with the Skills CLI
Run this command in your terminal:
npx skills add content-designer/ux-writing-skillThe CLI downloads the skill and configures it automatically for your agent. Restart your agent or IDE after installation.
Verify it's working by asking your agent:
Write an error message for when a payment failsYour agent will apply UX writing best practices and produce a clear, empathetic error message.
For Teams: Project Installation
Want your whole team to use this skill automatically? Run the CLI from your project root:
npx skills add content-designer/ux-writing-skillThen commit the installed skill files to your repository. Teammates get the skill when they pull the code.
Figma Integration
Review and improve UX copy directly from your Figma designs!
Connect this skill to Figma through your agent to analyze mockups, audit copy, and suggest improvements based on UX writing best practices. Perfect for:
- Content designers reviewing flows before launch
- Product teams iterating on copy in designs
- Design QA and accessibility audits
- Cross-platform consistency checks
📖 Setup guide for all agents: docs/figma-integration.md
Usage Examples
Basic Usage
Write an error message for when a payment failsYour agent applies the skill automatically and generates clear, actionable error messages following best practices.
Editing Existing Copy
Review this button label: "Submit your information for processing"Your agent evaluates against the four quality standards and suggests improvements.
Creating Consistent Patterns
Create empty state copy for a task list, keeping voice consistent with:
- Purposeful, Concise, Conversational, Clear
- Professional but friendly toneYour agent applies the appropriate patterns and maintains voice consistency.
Evaluating Quality
Score this error message:
"An error occurred. Please try again later."Your agent uses the content usability checklist to provide detailed scoring and improvement suggestions.
How It Works
This skill uses model-invoked activation — Claude, Codex, and Cursor automatically decide when to use it based on your request. You don't need to explicitly call the skill; it activates when you:
- Write or edit interface copy
- Create error messages, notifications, or empty states
- Work on button labels, form fields, or instructions
- Review product content for consistency
- Establish voice and tone guidelines
The AI loads reference materials progressively, using only what's needed for your specific task to maintain efficient context usage.
In Codex, you can also explicitly invoke the skill using $ux-writing or through the /skills command. In Cursor, use @ux-writing or reference the skill by name in your prompt.
What You'll Learn
Using this skill exposes the systematic thinking behind effective UX writing:
- How to evaluate content objectively with scoring frameworks
- Why certain patterns work across different product contexts
- How voice stays consistent while tone adapts to situations
- The difference between writing for clarity vs. writing for personality
For Content Design Teams
This skill can serve as:
- Onboarding tool: New team members learn patterns faster
- Quality baseline: Consistent standards across all writers
- Efficiency multiplier: Generate first drafts that follow guidelines
- System documentation: Reference materials that never go stale
Credits
Built by Christopher Greer, Staff Content Designer at Stripe, based on established UX writing principles from:
- Content Design by Sarah Richards
- Strategic Writing for UX by Torrey Podmajersky
- Nicely Said by Kate Kiefer Lee and Nicole Fenton
- Google Material Design writing guidelines
- Years of practical application building design systems
Contributing
Contributions welcome! If you have:
- Additional reference patterns
- More real-world examples
- Template improvements
- Translations to other languages
Please open an issue or submit a pull request.
Building the Skill Package
If you're contributing or want to build the skill ZIP locally:
./build-skill.shThis creates dist/ux-writing-skill.zip containing only the skill files (SKILL.md, docs/, examples/, references/, templates/).
The build script excludes repository files like README.md, CONTRIBUTING.md, index.html, and the demo video — these live on GitHub but aren't needed in the skill package.
License
MIT License — use this skill freely in your projects and teams.
Related Work
Looking for more agent skills?
- Learn about the standard: agentskills.io
- Browse skills on skills.sh
- Install skills with the skills CLI
For Claude
- Browse the Claude Code Skills collection
- Learn about agent skills architecture
- Read best practices for authoring skills
For Codex
- Explore Codex Agent Skills documentation
- Learn how to create custom skills
- Join the OpenAI Developer Community to discuss skills
For Cursor
- Read about Cursor Agent Skills
Why This Matters
Content is infrastructure. Every button label, error message, and empty state shapes how people understand and use your product. Good UX writing shouldn't depend on having an expert review every string.
This skill makes UX writing excellence systematic, scalable, and consistent — exactly what design systems do for visual design.
---
Status: Production-ready • Version: 1.6.0 • Last updated: March 2026
Accessibility Guidelines for UX Writing
Writing accessible content ensures all users—including those using assistive technology, experiencing cognitive differences, or facing situational limitations—can understand and interact with your product.
Core Principles
1. Perceivable
Users must be able to perceive the information being presented.
For UX Writers:
- Provide text alternatives for non-text content
- Don't rely on color alone to convey meaning
- Ensure sufficient color contrast (WCAG AA: 4.5:1 for body text, 3:1 for large text)
- Write clear, descriptive labels for all interactive elements
2. Operable
Users must be able to operate the interface.
For UX Writers:
- Write clear button labels that describe the action
- Provide skip links for navigation ("Skip to main content")
- Write descriptive link text (not "click here")
- Use consistent terminology for navigation
3. Understandable
Users must be able to understand the information and interface.
For UX Writers:
- Use plain language (7th-8th grade reading level)
- Keep sentences short (8-14 words for critical content)
- Define technical terms on first use
- Provide clear instructions and error messages
4. Robust
Content must work with current and future assistive technologies.
For UX Writers:
- Write proper labels for form fields
- Structure content with clear headings
- Use semantic HTML-friendly language
- Ensure error messages are programmatically associated with fields
---
Screen Reader Optimization
How Screen Readers Work
Screen readers announce content linearly, reading: 1. Element type (button, link, heading, form field) 2. Label or text content 3. State (expanded, collapsed, selected, required)
Writing for Screen Readers
Buttons
- ❌ Poor: "Submit" (context missing)
- ✅ Good: "Submit application"
- ✅ Better: "Submit job application"
Links
- ❌ Poor: "Click here to learn more"
- ❌ Poor: "Read more" (about what?)
- ✅ Good: "Learn about our privacy policy"
- ✅ Good: "View pricing details"
Form Fields
- ❌ Poor: Placeholder text as only label
- ✅ Good: Visible label + optional placeholder
- ✅ Example: Label: "Email address", Placeholder: "name@example.com"
Error Messages Screen readers read the field label + error message together, so write errors that make sense in that context.
- ❌ Poor: "Invalid" (announced as "Email address, invalid")
- ✅ Good: "Must include @" (announced as "Email address, must include @")
- ✅ Better: "Email must include @" (complete sentence)
Images and Icons
- Write meaningful alt text that conveys purpose
- ❌ Poor: "image.png"
- ❌ Poor: "icon"
- ✅ Good: "Success" (for checkmark icon)
- ✅ Good: "Error: Payment failed" (for error icon)
ARIA Labels Use ARIA labels when visual context isn't available to screen readers:
- Search button with only magnifying glass icon: aria-label="Search"
- Close button with only X icon: aria-label="Close dialog"
- Social media links with only icons: aria-label="Visit us on Twitter"
---
Cognitive Accessibility
Comprehension Research
- 8 words or fewer: 100% comprehension
- 14 words or fewer: 90% comprehension
- 25+ words: Comprehension drops significantly
Best Practices
Keep Sentences Short
- Critical instructions: 8-14 words maximum
- Error messages: 12-18 words (including solution)
- General content: 15-20 words average
- Complex explanations: Break into multiple short sentences
Use Simple Language
- Choose common words over complex ones
- ❌ "Utilize" → ✅ "Use"
- ❌ "Purchase" → ✅ "Buy"
- ❌ "Terminate" → ✅ "End"
- Avoid jargon unless your audience expects it
- Define technical terms on first use
Create Scannable Content
- Use clear headings (H1, H2, H3 hierarchy)
- Break content into short paragraphs (3-4 lines max)
- Use bulleted lists for related items
- Front-load important information
Provide Consistent Patterns
- Use the same words for the same actions
- Place elements in predictable locations
- Follow established UI patterns
- Reduce cognitive load in high-stress moments (errors, confirmations)
Reduce Memory Load
- Don't make users remember information from previous screens
- Repeat critical information when needed
- Provide context at the point of action
- Use progressive disclosure for complex flows
---
Plain Language Guidelines
Reading Level Targets
General Public
- Target: 7th-8th grade (Flesch-Kincaid)
- Sentence length: 15-20 words average
- Word choice: Common, everyday words
Professional Tools
- Target: 9th-10th grade
- Sentence length: 20-25 words maximum
- Word choice: Industry terms okay if audience expects them
Technical Products
- Target: 10th-11th grade
- Sentence length: 25 words maximum
- Word choice: Technical terms with clear definitions
Plain Language Techniques
Active Voice (85% of the time)
- ❌ Passive: "Your account was created"
- ✅ Active: "We created your account"
- ❌ Passive: "Payment will be processed"
- ✅ Active: "We'll process your payment"
Concrete Verbs
- ❌ Weak: "Make a selection"
- ✅ Strong: "Choose"
- ❌ Weak: "Provide notification"
- ✅ Strong: "Notify"
Positive Framing
- ❌ Negative: "Don't forget to save"
- ✅ Positive: "Remember to save"
- ❌ Negative: "You can't proceed without..."
- ✅ Positive: "To proceed, please..."
Avoid Idioms and Metaphors These don't translate well and confuse non-native speakers:
- ❌ "Get the ball rolling"
- ❌ "Think outside the box"
- ❌ "Hit the ground running"
- ✅ Use literal language instead
---
Multi-Modal Communication
Don't Rely on Color Alone
Bad Example:
- Red text: "Email"
- (Users with color blindness can't distinguish the error)
Good Example:
- "Error: Email must include @" + red icon
- (Text provides meaning independent of color)
Redundant Cues
Provide multiple ways to perceive important information:
Status Messages
- Color + icon + text
- Example: Green checkmark + "Success: Changes saved"
Required Fields
- Asterisk + "required" label + error on submission
- Example: "Email address " with note " Required field"
Error States
- Color + icon + error message + border
- Example: Red border + error icon + "Email must include @"
Links vs Plain Text
- Color + underline (or other visual distinction)
- Ensure 3:1 contrast ratio between link and body text
---
Forms and Input Accessibility
Labels
Always Visible
- Don't hide labels on focus
- Don't use placeholder as only label
- Keep labels adjacent to fields
Clear and Descriptive
- ❌ Poor: "Name"
- ✅ Good: "Full name"
- ✅ Better: "Full name (as it appears on your ID)"
Instructions
Provide Before Input
- Explain requirements before user types
- Keep instructions visible as user completes field
Be Specific
- ❌ Vague: "Enter valid email"
- ✅ Specific: "Email must include @"
- ✅ Example: "Email (you@example.com)"
Error Messages
Pattern: [What's wrong]. [How to fix].
- ❌ "Invalid"
- ❌ "Error"
- ✅ "Email must include @"
- ✅ "Password must be at least 8 characters"
Timing
- Inline validation: Show after user completes field
- Form-level: Show on submit, with focus moved to first error
- Real-time: Only for format requirements (password strength)
Location
- Place error message near the field (above or below)
- Ensure screen readers announce error with field label
- Maintain error message while user corrects input
---
Writing for Translation
Keep It Simple
- Short sentences translate more accurately
- Simple grammar reduces translation errors
- Common words have clearer equivalents
Avoid Culturally-Specific References
- ❌ "Home run" (baseball reference)
- ❌ "The ball is in your court" (idiom)
- ❌ "During the holidays" (varies by culture)
- ✅ Use universal concepts
Plan for Text Expansion
Text expands in translation:
- German: +30-40%
- French/Spanish: +15-20%
- Italian/Portuguese: +20-25%
Design Implications:
- Buttons: Allow for 150-200% text expansion
- Titles: Plan for 130-150% expansion
- Character limits: Test with longest likely translation
Gender-Neutral Language
- Use "they/them" for unknown subjects
- Avoid gendered job titles
- ❌ "Policeman" → ✅ "Police officer"
- ❌ "Stewardess" → ✅ "Flight attendant"
- Structure sentences to avoid gender assumptions
---
High-Stress Context Accessibility
Users experiencing stress, frustration, or urgency have reduced cognitive capacity.
Error Messages
- Be immediately clear: State the problem upfront
- Provide quick recovery: One-step solution when possible
- Avoid blame: Never use judgmental language
- Stay calm: Reassuring tone without being condescending
Time-Sensitive Actions
- Clear deadlines: Specific times, not "soon"
- Visible countdown: "5 minutes remaining"
- Obvious actions: Bold, clear CTAs
High-Stakes Decisions
- Transparent consequences: "You'll lose all data"
- Reversibility: State if action can be undone
- Easy exit: Clear "Cancel" or "Go back" options
---
Testing for Accessibility
Automated Tools
- WAVE: Web accessibility evaluation tool
- axe DevTools: Browser extension for accessibility testing
- Lighthouse: Built into Chrome DevTools
Manual Testing
Screen Reader Test
- Turn on VoiceOver (Mac) or NVDA (Windows)
- Navigate using keyboard only
- Verify all content is announced meaningfully
- Check that error messages are clear when announced
Readability Test
- Hemingway Editor: Highlights complex sentences
- Readable.com: Multiple readability scores
- Microsoft Word: Flesch-Kincaid scoring
Color Contrast Test
- WebAIM Contrast Checker
- Verify 4.5:1 for body text
- Verify 3:1 for large text and UI elements
Keyboard Navigation Test
- Unplug your mouse
- Complete all tasks using only keyboard
- Verify all interactive elements are reachable
- Check that focus order is logical
---
Quick Reference Checklist
Before Publishing Any UX Text
- [ ] All interactive elements have clear, descriptive labels
- [ ] Links describe destination ("View pricing" not "Click here")
- [ ] Error messages are specific and actionable
- [ ] Color is not the only indicator of meaning
- [ ] Text has sufficient contrast (4.5:1 minimum)
- [ ] Sentences average 15-20 words or fewer
- [ ] Reading level is appropriate for audience
- [ ] No idioms, metaphors, or cultural references
- [ ] Required fields are marked with more than just color
- [ ] Form instructions appear before input fields
- [ ] Success and error states include text, not just icons
---
Resources
WCAG Guidelines
Testing Tools
Plain Language
Screen Readers
- VoiceOver (Mac/iOS): Built-in
- NVDA (Windows): Free download
- JAWS (Windows): Commercial
---
Remember: Accessibility isn't a feature—it's a baseline requirement. Writing accessibly makes your product better for everyone, not just users with disabilities.
Content Usability Checklist
Use this checklist to evaluate UX text quality. Rate each criterion 0-10.
Concise
Every word has a distinct job
- No filler words like "basically", "actually", "just"
- Each word adds meaning or clarity
- Can't remove words without losing meaning
High information density in minimal words
- Maximum meaning per word
- Efficient phrasing
- No redundancy
40-60 characters per line
- Optimal line length for readability
- Breaks appropriately for scanning
- Not too long (causes focus loss) or too short (causes back-and-forth eye movement)
Short sentences and paragraphs
- Less than 3-4 lines per paragraph
- Sentences vary in length but average ~15-20 words
- Broken into scannable chunks
Front-loaded with signal words
- Most important words come first
- Action words at start of sentences
- Users see key information immediately
Ideas ordered by priority
- Most critical information first
- Secondary details follow
- Nice-to-know information last
Purposeful
User goals are clear and supported
- Text helps users complete their task
- Addresses user's "why am I here?" question
- Removes barriers to action
Business goals are met
- Supports conversion, engagement, or retention
- Aligns with product objectives
- Advances organizational goals
Brand voice is reflected
- Consistent with brand personality
- Recognizable as coming from this product
- Uses appropriate tone for context
Value proposition is evident
- User benefit is clear
- Explains "what's in it for me?"
- Shows value before asking for action
Subject matter focuses on user benefit
- Written in second person ("you")
- Emphasizes outcomes, not features
- User-centered, not company-centered
Active, inviting framing
- Motivates action without being pushy
- Matches user's intention and journey stage
- Appropriate level of urgency
Conversational
Natural, spoken language
- Sounds like something you'd say aloud
- Flows naturally when read
- Not stiff or overly formal
Active voice predominates
- Subject performs the action
- Direct and energetic
- Use passive only when it's clearer (rare cases)
Connecting words included
- Prepositions present ("to", "from", "with")
- Articles included ("a", "an", "the")
- Not telegraphic or robotic
Familiar words and phrases
- Uses language your users use
- Based on user research and testing
- No unnecessary technical jargon
Personality in appropriate moments
- Voice shines through when context allows
- Not overly serious in light contexts
- Not playful in serious moments
Clear
Accurate action words
- Specific verbs that describe the action
- "Delete" not "Remove" for permanent deletion
- "Save" not "OK" for saving changes
Command forms used appropriately
- Active imperative for buttons
- Clear, direct instructions
- Action-oriented language
Plain language
- 7th grade reading level for general audience
- 10th grade for professional contexts
- Avoids complex vocabulary and sentence structures
Meaningful, descriptive titles
- Titles tell you where you are
- Not generic or vague
- Provide context and orientation
Consistent patterns and terminology
- Same word means same thing throughout
- UI patterns applied consistently
- Terminology documented in style guide
Scoring Guide
9-10: Excellent — Best practice example 7-8: Good — Minor improvements possible 5-6: Adequate — Notable issues to address 3-4: Needs work — Significant problems 0-2: Poor — Major revision required
How to Use This Checklist
1. Review individual pieces — Evaluate specific UI strings, messages, or flows 2. Audit entire experiences — Score major screens or user journeys 3. Compare options — Rate different versions to choose the best 4. Track improvements — Measure before and after edits 5. Build rationale — Use scores to explain writing decisions 6. Focus efforts — Identify lowest-scoring areas to improve first
Example Evaluation
Text: "An error occurred while processing your request. Please try again."
Concise: 6/10 — Wordy, could be "We couldn't process your request. Try again." Purposeful: 4/10 — Doesn't help user fix the problem or explain what happened Conversational: 5/10 — Somewhat robotic, "an error occurred" is system-speak Clear: 5/10 — Vague, doesn't specify what error or why
Overall: 5/10 — Adequate but needs significant improvement
Improved: "We couldn't save your changes. Check your connection and try again."
Concise: 9/10 — Brief, direct, no wasted words Purposeful: 8/10 — Suggests likely cause (connection) and next step Conversational: 9/10 — Natural, human phrasing Clear: 9/10 — Specific about what failed and what to do
Overall: 9/10 — Excellent
Voice Chart Template
A voice chart helps establish consistent brand personality across all UX text. Use this template to define your product's voice.
Structure
A voice chart contains three key elements for each brand concept:
1. Concept — A core brand principle or value 2. Voice Characteristics — Adjectives describing how the concept manifests in writing 3. Examples — Concrete do/don't pairs showing the voice in action
Template
Concept 1: [Brand Principle]
Voice characteristics: [Adjective 1], [Adjective 2], [Adjective 3]
Description: [1-2 sentences explaining what this means for the writing]
Do:
- Example of text that embodies this concept
- Another example showing this voice
Don't:
- Example of what to avoid
- Counter-example that violates this voice
---
Concept 2: [Brand Principle]
Voice characteristics: [Adjective 1], [Adjective 2], [Adjective 3]
Description: [1-2 sentences explaining what this means for the writing]
Do:
- Example of text that embodies this concept
- Another example showing this voice
Don't:
- Example of what to avoid
- Counter-example that violates this voice
---
Concept 3: [Brand Principle]
Voice characteristics: [Adjective 1], [Adjective 2], [Adjective 3]
Description: [1-2 sentences explaining what this means for the writing]
Do:
- Example of text that embodies this concept
- Another example showing this voice
Don't:
- Example of what to avoid
- Counter-example that violates this voice
---
Example: TAPP Transit System
Concept 1: Helpful
Voice characteristics: Friendly, supportive, clear
Description: TAPP is a companion that helps riders navigate the transit system with confidence. We anticipate questions and provide clear guidance.
Do:
- "Your bus arrives in 5 minutes at Bay St."
- "Tap your card when you board and when you exit."
Don't:
- "Arrival: 5 min"
- "Payment required at entry and exit points."
---
Concept 2: Efficient
Voice characteristics: Concise, direct, scannable
Description: Riders are often in a hurry. We respect their time by being brief and front-loading important information.
Do:
- "Route delayed 10 minutes due to traffic"
- "Transfer at Main St for Line 3"
Don't:
- "Due to unexpected traffic conditions, your route is experiencing delays of approximately 10 minutes"
- "You can transfer to Line 3 if you get off at Main St"
---
Concept 3: Trustworthy
Voice characteristics: Honest, transparent, reliable
Description: Riders depend on TAPP to get where they need to go. We're upfront about problems and provide accurate information.
Do:
- "This route is currently unavailable. Use Route 42 instead."
- "Your payment didn't go through. Update your card to continue."
Don't:
- "Service interruption on this route."
- "Payment error. Try again."
---
Tips for Creating Your Voice Chart
1. Base it on brand values — Review mission, vision, values, and personality 2. Use 3-5 concepts — Enough to guide, not so many you can't remember 3. Be specific with examples — Show actual interface text, not abstract descriptions 4. Test against real scenarios — Apply to buttons, errors, and notifications 5. Share with your team — Voice only works if everyone uses it consistently 6. Update as you learn — Refine based on user research and team feedback
Common Voice Characteristics
Positive tones: Friendly, encouraging, optimistic, warm, enthusiastic, cheerful, supportive, welcoming, inspiring
Neutral tones: Professional, straightforward, clear, direct, informative, practical, matter-of-fact, efficient
Cautious/Serious tones: Careful, thoughtful, measured, precise, formal, reserved, respectful
Personality traits: Playful, witty, conversational, casual, technical, sophisticated, humble, confident, empowering
Choose characteristics that align with your brand and serve your users' needs in context.
Error Message Template
Use this template to write clear, actionable error messages that help users recover.
Structure
[What failed] [Why it might have failed, if known] [What to do next]Template
Inline Error (Form Validation)
Format: Brief, immediate correction guidance
[Field requirement or constraint]Examples:
- Email must include @
- Password needs 8+ characters
- Card number is incomplete
- Choose a future date
---
Detour Error (Recoverable Problem)
Format: Problem + Solution
**Title**: [Action that failed]
**Body**: [Brief explanation]. [Recovery instruction].
**Button**: [Specific recovery action]Example:
**Title**: Can't save changes
**Body**: Check your internet connection and try again.
**Button**: Retry---
Blocking Error (System Issue)
Format: Clear explanation + Timeline + Reassurance
**Title**: [What's unavailable]
**Body**: [Why it's unavailable]. [When it will be available]. [Reassurance about user data].
**Button**: [Status check or alternative action]Example:
**Title**: Service temporarily unavailable
**Body**: We're updating our systems and will be back in about 15 minutes. Your data is safe.
**Button**: Check status---
Error Message Checklist
Before finalizing an error message, verify:
- [ ] Avoids blame — No "invalid," "illegal," "wrong," "error"
- [ ] Empathetic tone — Acknowledge user frustration
- [ ] Specific problem — Not generic "something went wrong"
- [ ] Clear recovery — Tell user exactly what to do
- [ ] Front-loaded — Most important info first
- [ ] Active voice — "We couldn't save" not "changes could not be saved"
- [ ] Human language — Not system codes or technical jargon
Voice Variations by Context
High-Stakes Error (Payment, Security, Data Loss)
Tone: Serious, clear, reassuring
We couldn't process your payment. Your card wasn't charged. Check your card details and try again.Low-Stakes Error (Optional Feature, Nice-to-Have)
Tone: Light, helpful, not dramatic
Couldn't load preview. Refresh to try again.First-Time User Error
Tone: Educational, patient
Profile photo must be under 5MB. Try a smaller file or compress your image.Common Mistakes to Avoid
❌ Vague: "An error occurred" ✅ Specific: "We couldn't save your changes"
❌ Blaming: "Invalid email address" ✅ Guiding: "Email must include @"
❌ Technical: "ERR_CONNECTION_TIMEOUT" ✅ Human: "Connection timed out. Check your internet and try again."
❌ No solution: "Upload failed" ✅ Actionable: "Upload failed. Check your file size and try again."
❌ Passive: "Your request could not be processed" ✅ Active: "We couldn't process your request"
Quick Fill Template
Use this for rapid error message drafting:
What failed: Why (if known): What user should do:
Draft: [What failed]. [Why, if known]. [Next action].
Example filled:
- What failed: Couldn't send invite
- Why: Email bounced
- What to do: Check spelling
Draft: "Couldn't send invite. Check the email address and try again."
Related skills
How it compares
Pick this over marketing copy skills when the deliverable is in-product UI strings, errors, and forms rather than campaigns or landing-page prose.
FAQ
What interface elements does ux-writing cover?
ux-writing covers buttons, labels, error messages, notifications, forms, onboarding, empty states, success messages, help text, and conversational flows using four quality standards: purposeful, concise, conversational, and clear.
When should developers invoke ux-writing?
Invoke ux-writing when writing or editing any text in apps or websites—designing forms, fixing errors, drafting onboarding, establishing voice and tone, or auditing UI strings for consistency and accessibility.
Does ux-writing include accessibility guidance?
Yes. ux-writing includes accessibility guidelines and research-backed benchmarks so interface microcopy stays clear for assistive technologies and diverse reading levels, not just visual layout.
Is Ux Writing safe to install?
skills.sh reports 3 of 3 security scanners passed. Review the Security Audits panel on this page before installing in production.