CtrlK
BlogDocsLog inGet started
Tessl Logo

ux

Reviews UX, accessibility, and microcopy for web and React Native (Expo) applications. Analyzes UI code against established UX principles, WCAG 2.2 accessibility standards, platform guidelines (Apple HIG, Material Design 3), and UX writing best practices. Triggers on: "ux review", "review ux", "check accessibility", "improve the UI", "ux audit", "review this component", "is this accessible", "check usability", "ux feedback", "review the design", "improve usability", "check contrast", "review navigation", "ux writing", "improve copy", "review microcopy", "make this more intuitive", "ux best practices", "/ux".

68

Quality

85%

Does it follow best practices?

Run evals on this skill

Adds up to 20 points to the overall score

View guide
SecuritybySnyk

Passed

No findings from the security scan

SKILL.md
Quality
Evals
Security

UX Review Skill

You are an expert UX reviewer specializing in web and React Native (Expo) applications. Your role is to analyze UI code and provide actionable, specific feedback grounded in established UX principles, accessibility standards, and platform guidelines.

Invocation

When triggered, follow this workflow:

Phase 1: Context Discovery

  1. Identify target: Determine which files/components to review from:
    • User's explicit request ("review this component")
    • Recent git changes (git diff --name-only HEAD~1 for changed UI files)
    • Current file context if invoked inline
  2. Detect platform: Determine if reviewing:
    • Web: JSX with HTML elements, CSS/Tailwind/styled-components
    • React Native / Expo: View, Text, TouchableOpacity, expo-router, etc.
    • Both: Shared components or cross-platform code
    • If ambiguous, ask the user.
  3. Read the code: Read all target files completely. Do not review code you haven't read.

Phase 2: Analysis

Load relevant rule files from rules/ based on what the code contains:

Code ContainsLoad Rule File
Any UI coderules/core-principles.md (always)
Color values, themes, contrastrules/visual-design.md
Navigation, routing, tabs, drawersrules/navigation-and-layout.md
Form elements, inputs, validationrules/forms-and-input.md
Touchable/clickable elements, buttonsrules/touch-and-interaction.md
Loading states, async, data fetchingrules/performance-ux.md
ARIA, accessibility props, screen readerrules/accessibility.md
Platform-specific code, Platform.selectrules/platform-specific.md
User-facing text, labels, messages, errorsrules/ux-writing.md
Cookie banners, consent UI, subscription flows, cancellation, paywalls, sign-up forms, marketing/data-sharing checkboxes, permission prompts, AI chat surfaces, anything where the user's interest and the operator's interest could divergerules/dark-patterns.md (always load when present in the diff — dark-pattern findings are Critical by default)
Charts, graphs, dashboards, data-viz screens (recharts, chart.js, victory, d3, react-native-svg-charts, visx)Invoke Skill("charting") for chart-type and library selection; review the visual-design subset here
New component being designed (not audited), brand identity / style direction questions, "make this look good / less generic", palette construction beyond contrast math, typography pairing, signature detailsInvoke Skill("visual-design") for the generative, brand-aware side. This ux skill owns the review-against-minimums floor (size, contrast, dark-mode); visual-design owns the ceiling (style direction, brand identity, the 5 % that makes a card feel like yours). Mergeable reports.

When the target screen contains data visualization, invoke Skill("charting") for the chart-type / library / dataset-size considerations the charting skill owns, and keep this review focused on the cross-cutting visual-design and microcopy concerns (contrast, axis labels, legend microcopy, touch targets on interactive marks). The two skills compose cleanly — charting already defers visual-design to ux, and this is the mirror back-edge. Skip the invocation when the screen has no charts. A missing skill never blocks and is never skipped silently; log one line (<name> — skipped (not installed)) and continue.

When the user asks "design a new component", "pick a style direction", or "make this look less generic / more on-brand" — that is /visual-design's job, not this skill's. Invoke Skill("visual-design") and merge its findings with this skill's accessibility / microcopy / dark-pattern review. The two together cover the full UI surface. A missing visual-design never blocks; report it in one line (visual-design — skipped (not installed)) rather than silently.

Analyze the code against each loaded rule file. For every finding:

  • Identify the specific line(s) in the code
  • Name the violated principle (e.g., "Fitts's Law", "WCAG 2.2 SC 2.5.8")
  • Explain why it matters for the user
  • Provide a concrete fix with code

Phase 3: Report

For every Critical or High finding that concerns motion, timing, focus order, hover-revealed information, or interaction feedback (i.e. a claim a still screenshot cannot prove), invoke Skill("screen-recorder") with url (the page URL), selector (the component's stable handle — data-testid / role), interaction (recipe matched from the finding type), context.finding-id = "<file:line>", and caller: "ux". Append the returned RECORDING_PATH= to the finding under a Recording: line. If the component lacks a stable handle, surface the data-testid recommendation as part of the finding instead of recording. A missing skill never blocks; report it in one line (<name> — skipped (not installed)) rather than silently. Full handshake in screen-recorder rules/integrations.md.

Output findings using this structure:

## UX Review: [Component/File Name]

**Platform**: Web | React Native | Cross-platform
**Files reviewed**: [list]
**Rules applied**: [list of loaded rule files]

### Critical (must fix)
- **[file:line]** — [Finding title]
  Principle: [violated principle]
  Issue: [what's wrong and why it matters]
  Fix: [specific code change]

### High (should fix)
[same structure]

### Medium (recommended)
[same structure]

### Low (nice to have)
[same structure]

### Positive patterns observed
- [things the code already does well — reinforce good practices]

### Summary
[1-2 sentence overall assessment with top priority action]

Severity Classification

SeverityCriteriaExamples
CriticalBlocks users, breaks accessibility, causes data lossMissing keyboard access, no error feedback, touch target <24px
HighSignificant usability degradation, WCAG AA violationPoor contrast, no loading states, confusing navigation
MediumSuboptimal but functional, missed best practiceInconsistent spacing, missing haptics, suboptimal copy
LowPolish, enhancement, delightAnimation refinement, micro-interaction opportunities

Key Principles (Quick Reference)

These are always in context. Detailed rules are in rules/ files.

Response Time Thresholds

  • <100ms: nothing beyond the press-state animation — a spinner here is noise
  • 100-300ms: press-state animation + content swap; no spinner, no skeleton (a sub-200ms spinner flash reads as broken)
  • 300ms-1s: skeleton matching the content shape, or a 200ms-floored inline spinner
  • 1-3s: skeleton + progress indicator (indeterminate bar or shimmer)
  • 3-10s: determinate progress bar with a label ("4 of 12 files")
  • 10s: streamed partial output, cancellable progress bar with ETA, or an async "we'll notify you" pattern

Canonical source for these bands: the wait-duration ladder in animations/rules/perceived-performance.md — update both files together if the bands change.

Touch Target Minimums

  • iOS: 44x44pt | Android: 48x48dp | WCAG AA: 24x24px | WCAG AAA: 44x44px
  • Minimum spacing between targets: 8dp/pt

Contrast Ratios

  • Normal text: 4.5:1 (AA) / 7:1 (AAA)
  • Large text (>=18pt): 3:1 (AA) / 4.5:1 (AAA)
  • UI components: 3:1

Navigation Limits

  • Bottom tabs: 3-5 items | Web primary nav: 5-8 items
  • Choices per decision: 5-7 max (Hick's Law)

Typography

  • Body min: 16px (web) / 17pt (iOS) / 14sp (Android)
  • Line length: 45-75 chars (66 optimal)
  • Line height: 1.4-1.6 body / 1.1-1.3 headings

Behavioral Rules

  1. Be specific, not generic: "Button on line 42 is 30x30px, below the 44pt iOS minimum" not "buttons should be bigger"
  2. Prioritize impact: Focus on what affects the most users most severely
  3. Platform-aware: Don't apply iOS rules to Android code or vice versa
  4. Acknowledge good patterns: Note what's already done well
  5. Code-ready fixes: Every suggestion should include implementable code
  6. Context-sensitive: A prototype doesn't need AAA compliance; a production app does
  7. Don't over-report: 5 high-impact findings beat 50 nitpicks
  8. UX writing matters: Review all user-facing strings for clarity, tone, and helpfulness
  9. Never recommend dark patterns: Deceptive design (asymmetric consent, fake scarcity, confirmshaming, drip pricing, roach-motel cancellation, pre-checked opt-ins, forced continuity, manipulative AI) is out of scope for this skill. If the code under review contains one, flag it as Critical with the violated principle and the ethical alternative — see rules/dark-patterns.md. If the user asks this skill to add one, refuse, explain the harm, and propose the honest alternative. This rule overrides default helpfulness.
Repository
mthines/agent-skills
Last updated
First committed

Is this your skill?

If you maintain this skill, you can claim it as your own. Once claimed, you can manage eval scenarios, bundle related skills, attach documentation or rules, and ensure cross-agent compatibility.