AgentStack
Browse Sign in
Browse Why AgentStack Sell Docs
Sign in
SKILL verified MIT Self-run

Ux Review

skill-pjankiewicz-skills-ux-review · by pjankiewicz

Use when auditing or reviewing the UX/interaction quality of a mobile (iOS/Android) or web app — checking whether screens have distinct pressed/focus/disabled states, proper empty/loading/error states, accessible touch targets, platform-native conventions (Apple HIG / Material 3), WCAG 2.2 AA contrast, honest system status feedback, and clear copy. Provides a per-screen PASS/FAIL heuristic rubric…

No reviews yet
0 installs
41 views
0.0% view→install

Install

$ agentstack add skill-pjankiewicz-skills-ux-review

✓ scanned · ✓ verified, works with Claude Code, Cursor, and more.

Security review

✓ Passed

No issues found. Passed automated security review. · v0.1.0 How review works →

  • Prompt-injection patterns
  • Secret / credential exfiltration
  • Dangerous shell & filesystem operations
  • Untrusted network calls
  • Known-malicious package signatures

What it can access

  • Network access No
  • Filesystem access No
  • Shell / process execution No
  • Environment & secrets No
  • Dynamic code execution No

From automated source analysis of v0.1.0. “Used” means the capability is present in the source — more access means more to trust, not that it’s unsafe.

View the full security report →

Verified badge

Passed review? Show it. Paste this badge into your README, it links to the public security report.

AgentStack Verified badge Links to your public security report.
[![AgentStack Verified](https://agentstack.voostack.com/badges/verified.svg)](https://agentstack.voostack.com/security/report/skill-pjankiewicz-skills-ux-review)

Reliability & compatibility

Security review passed
0 installs to date
no reviews yet
3mo ago

Declared compatibility

Claude CodeClaude Desktop

Compatibility is declared by the source manifest. End-to-end runtime verification is coming, see below.

Preview Execution monitoring

We're building live execution health for every listing: tool-call success rate, median latency, uptime, and last-checked timestamps, measured, not self-reported. It isn't live yet, so we don't show numbers we can't stand behind.

How agent discovery & health will work →
Are you the author of Ux Review? Claim this listing to set pricing, connect Stripe payouts, and keep 70% of every sale.
Sign up to claim

About

ux-review

A per-screen, PASS/FAIL-scorable rubric for auditing the interaction quality of a mobile or web UI — the layer that unit tests and "does it compile" never catch and that a user discovers in the first five minutes: dead-feeling buttons, missing empty/error states, mis-sized touch targets, keyboard overlap, inconsistent platform behavior, low contrast, hype-y copy.

This rubric hunts works-but-feels-wrong. Pair it with a functional bug sweep (see the companion app-bug-sweep skill) which hunts broken.

When to use

  • Reviewing a screen, flow, or whole app for UX quality before or after shipping.
  • A build "works" but "doesn't feel good" and you need to localize why.
  • Running an accessibility / platform-conventions pass.
  • Standing QA gate on a multi-platform app where iOS and Android drift apart.

How to apply

Score one screen × one state at a time (idle / loading / empty / error / populated). Mark each applicable criterion PASS / FAIL / N/A with a one-line note; for a FAIL, name the specific element and the fix. A screen passes only when all applicable criteria pass.

Sections 1–3 carry the most weight — a FAIL there is a defect, not a nice-to-have, because they cover the states that make an app feel alive, honest, and recoverable.

For a whole-app audit, fan out one reviewer per surface cluster (e.g. home / primary-loop / settings / discovery), each scoring every screen in its cluster on both platforms, and treat any iOS-vs-Android inconsistency as its own finding — divergence is where most defects hide.

The rubric

1. Affordance & microinteraction states

1.1 Every tappable element (button, pill, card, row, icon button) has a visibly distinct pressed/active state (state-layer ripple on Android per M3; scale/opacity/tint on iOS; :active on web). Holding produces immediate visual change. FAIL if pressed looks identical to idle. 1.2 Every interactive element has a distinct focus state separate from pressed (keyboard / D-pad / switch-control on Android & web; :focus-visible ring — never outline:none with no replacement). 1.3 Pressed/active/focus states are more prominent than rest, not less. Hover (where a pointer exists) is lower-emphasis than pressed. 1.4 Disabled state is de-emphasized (reduced opacity / desaturated) AND inert (no ripple, no navigation). A control never silently no-ops while looking enabled. 1.5 Interactive elements look tappable; static text/labels are not styled to look tappable. Actions use real button semantics, not tap handlers on plain containers. 1.6 Press feedback is immediate — fires on touch-down/contact, not only after a network round-trip. Show optimistic state on tap; reconcile after. 1.7 Selected / active toggle states (selected tab, chosen item) are distinct from both idle and pressed, and persist after the finger lifts. 1.8 Animations are interruptible — a new tap mid-animation responds immediately; the UI never locks the user out waiting for a transition.

2. Feedback & system status

2.1 The user always knows whether the app is loading, waiting, succeeded, or errored. No state where a tap appears to do nothing. 2.2 A streaming / "working" indicator is a single anchored affordance that crossfades between phases — not a flashing stack of per-step rows, and it must not jump layout position. 2.3 Every committed action gives confirming feedback (a save / add / toggle produces a visible state change or toast; aria-live="polite" on web). FAIL if the UI claims success ("Saved", "Logged") but the underlying state didn't change — cross-check against data where possible. 2.4 Haptics accompany meaningful state changes (completion, threshold cross, destructive confirm) and are used sparingly — not on every scroll tick. Honor system "reduce" settings. 2.5 Async results are announced to assistive tech; status is not conveyed by color/icon alone. 2.6 Long operations (>~1s) show progress; near-instant ones (<300ms, high confidence) show nothing rather than a flash of loading chrome.

3. Empty / loading / error states

3.1 Every list/collection screen renders a purpose-built empty state (icon + copy + a clear CTA to populate it), never a blank screen or broken layout for an empty array. 3.2 Empty states are distinct per context (empty collection vs. first-run vs. filtered-to-zero), not one generic placeholder reused everywhere. 3.3 Loading uses content-shaped skeletons matching the real geometry (no layout shift on data arrival) for loads of meaningful duration — not a bare centered spinner. 3.4 Error states say what went wrong AND the next step, never bare "An error occurred." Inline errors sit next to the offending field/item. 3.5 Every failure has a recovery path: a failed mutation shows a failed state ("Failed — tap to retry"), and retry preserves the user's input. 3.6 On a form-submit error, focus moves to the first errored field, visible without scroll guesswork. 3.7 Offline is surfaced as a clear, non-blocking banner; the app degrades gracefully (queues or clearly disables actions) rather than failing silently mid-action. 3.8 Loading button labels show a working state ("Saving…") and the trigger stays interactive until the request actually starts.

4. Navigation & information architecture

4.1 The user always knows where they are — current screen/section labeled, active tab/section visually marked. 4.2 Back/dismiss is always available and predictable on every non-root screen (iOS edge-swipe + nav back; Android system back + predictive-back not broken). No dead-end screens. 4.3 Standard system gestures are not overridden or blocked. Any custom gesture has a discoverable affordance and a non-gesture fallback. 4.4 Primary actions are reachable in the thumb zone; the most common action isn't buried in a top corner only. 4.5 Information scent: labels and CTAs predict their destination/result. No mystery-meat icons without labels for primary actions. 4.6 Modality used correctly: sheets/modals are for focused tasks and are dismissible (swipe-down + explicit close); a modal never traps the user with no exit. 4.7 The same content type opens via the same affordance everywhere (a row of type X always opens X the same way).

5. Touch targets & gestures

5.1 Tappable targets meet platform minimums: iOS ≥44×44pt, Android ≥48×48dp (WCAG 2.2 AA floor is 24×24px with spacing; platform minimums are stricter and win). Small glyphs still carry a full hit area. 5.2 Adjacent targets have ≥~8dp spacing — no mis-tap clusters (e.g. confirm vs. delete crammed together). 5.3 A control's label and the control share one hit target (tapping a toggle's label toggles it; no dead zone). 5.4 Destructive gestures (swipe-to-delete) require a confirm step or an undo window; a single swipe never irreversibly destroys data. 5.5 Gesture actions are discoverable (visible affordance or revealed on partial swipe) and duplicated in a visible menu — never gesture-only for an essential action. 5.6 Scroll and drag/swipe don't fight; on web, touch-action: manipulation removes the double-tap-zoom delay.

6. Consistency & platform conventions

6.1 iOS uses native controls (NavigationStack, .toolbar, TabView, .sheet, Menu, .searchable, system alerts) so platform materials and behaviors come for free; custom material is centralized, not hand-rolled per screen. 6.2 A single design implementation is not forked by OS version — newer-OS affordances degrade to an equivalent layout on older OS, same components and actions. 6.3 Android uses native Material 3 (M3 components, tonal surfaces, state-layer ripples, M3 motion) — not a clone of iOS. Edge-to-edge content respects system-bar insets (no content under status/nav bars, inputs not hidden behind the keyboard). 6.4 Destructive actions in menus/sheets are visually marked (destructive tint + icon) and separated from neutral actions; delete is never styled identically to a safe action. 6.5 Iconography is consistent and platform-appropriate (SF Symbols on iOS, M3 icons on Android) and adapts to text scaling and dark mode. 6.6 Safe areas / notch / home indicator / status bar respected; nothing clipped or tappable hidden under system chrome at any device size. 6.7 Dark mode supported via semantic colors that adapt automatically; no hardcoded light-only colors leak into dark mode. 6.8 One coherent visual system across splash / auth / primary surfaces on both platforms, using platform-native materials.

7. Accessibility

7.1 Every interactive/informative element has an accessible label (VoiceOver/TalkBack/aria-label). No control that announces as "button, button" with no name. 7.2 Text contrast meets WCAG AA: ≥4.5:1 normal, ≥3:1 large (≥18pt / 14pt-bold). FAIL on low-contrast gray captions/placeholders. 7.3 Non-text UI (icons, control borders, focus rings, chart strokes) meets ≥3:1 against adjacent colors (WCAG 1.4.11). 7.4 Dynamic Type / font scaling honored (Dynamic Type on iOS, sp on Android, relative units on web); layout doesn't clip/truncate/overlap at the largest accessibility text size. 7.5 Reduce Motion honored; nothing relies solely on motion to convey meaning. 7.6 Information is never conveyed by color alone (status also uses icon/text/shape). 7.7 Focus order is logical and follows reading order; assistive-tech users can reach and operate every action a sighted touch user can. 7.8 Structure semantics present (web: hierarchical headings + skip link; native: correct accessibility traits and grouping).

8. Content & voice

8.1 System/UI copy matches the product's defined voice and stays consistent. If the product voice is restrained, flag hype words and exclamation-heavy tone; if it's energetic, flag flatness. Pick a voice and hold it. 8.2 Microcopy is specific and actionable, not generic ("No items yet — add one to get started." not "Nothing here"). 8.3 Error/empty/confirmation copy tells the user what to do next, in plain language — no jargon or raw error codes surfaced to users. 8.4 Terminology is consistent app-wide (one concept = one word, matching the rest of the product). 8.5 No AI-attribution text ("Generated by…", "Made with…") anywhere in UI copy, share assets, or generated content.

9. Performance & perceived speed

9.1 First meaningful paint is fast; the screen shows skeleton/structure quickly rather than a blank frame. 9.2 No layout shift when real data replaces skeletons/placeholders. 9.3 Animations are compositor-friendly (transform/opacity; never transition: all); scrolling stays at 60fps on long lists. 9.4 Optimistic UI for common mutations: the UI updates instantly and reconciles/reverts on the server response rather than blocking on the round-trip. 9.5 No spinner for sub-300ms operations; no indefinite spinner with no timeout/fallback for operations that can fail (streaming responses must have a bounded fallback, never spin forever). 9.6 Repeat navigation to an already-loaded screen is instant (cached) — no full loading state for data already fetched this session.

Scoring & output

Per screen × per state, mark each applicable criterion PASS / FAIL / N/A with a one-line note and, for FAIL, the specific element. Report FAILs grouped by section, sorted by severity (blocker / major / minor), each with a file:line if reviewing code, the platform, and the recommended fix. End with severity counts and the top-5 highest-leverage fixes.

Sources

Nielsen's 10 usability heuristics (mobile interpretation); Apple Human Interface Guidelines (touch target 44pt, Dynamic Type, gestures, haptics, dark mode, modality); Material Design 3 (interaction states, 48dp targets, edge-to-edge insets, motion); WCAG 2.2 AA (contrast 1.4.3 / 1.4.11, target size, focus). Adapt the platform-specific minimums to your stack.

Source & license

This open-source skill is cataloged on AgentStack and links to its original source — we do not rehost the code.

Install and usage instructions live in the source repository linked above.

Reviews

No reviews yet, be the first.

Versions

  • v0.1.0 Imported from the upstream source.