Skip to content
Development
Skill

/ux-states-audit

Audit UI code for missing loading states, empty states, and error states. Every async operation and data-driven UI must handle all three. Finds gaps and implements the missing states using the app's existing patterns.

From plugin
meridian
1876 skills8 agents3 commands7 hooks

Claude Code

$ npx -y skills add markmdev/meridian --skill ux-states-audit --agent claude-code

SKILL.md

ux-states-audit.SKILL.md
name: ux-states-audit
description: Audit UI code for missing loading states, empty states, and error states. Every async operation and data-driven UI must handle all three. Finds gaps and implements the missing states using the app's existing patterns.

UX States Audit

Every piece of UI that fetches data or triggers async work has three states beyond the happy path: **loading**, **empty**, and **error**. LLMs implement the happy path and leave the rest blank. This skill finds and fills those gaps.

This is distinct from error-audit: error-audit finds errors that are *suppressed*. This finds states that were *never implemented*.

Step 0: Understand existing patterns

Before touching anything, read the codebase to understand how it currently handles these states:

  • What components or primitives exist for loading (skeletons, spinners, shimmer)?
  • What does an empty state look like — is there a shared component, or inline?
  • How are errors shown to users — toast, inline message, error boundary?

Use these patterns exclusively. Don't introduce a new loading spinner if one already exists.

What to look for

**Missing loading state:**

  • Data fetch starts, nothing changes in the UI until data arrives
  • Button triggered action with no pending/disabled state
  • Form submission with no in-progress indicator
  • Navigation or route transition with no feedback

**Missing empty state:**

  • List or table that renders nothing (blank space) when data is an empty array
  • Search results that show nothing without explanation
  • Dashboard widgets that disappear when there's no data instead of explaining why

**Missing error state:**

  • Fetch fails → component renders identical to loading or blank
  • Form submission fails → nothing visible changes
  • Mutation errors that are caught in the data layer but never reach the UI

Process

1. Identify the scope from the user's request 2. Find every component that fetches data or triggers async work 3. For each: check whether loading, empty, and error states are handled 4. Implement missing states using the patterns found in Step 0 5. Report what was added, by component

Fix principles

  • Loading states should be immediate — shown before the first byte arrives
  • Empty states should explain the situation and, where appropriate, offer an action ("No results — try a different search")
  • Error states should say what went wrong and what the user can do (retry, go back, contact support)
  • Don't invent new UI primitives — use what already exists in the codebase

Reference files

  • `references/ux-patterns.md` — Framework-specific patterns for missing loading, empty, and error states. Detection patterns, bad/fix examples. Read before starting the audit.

Report

Summarize by component: which states were missing, what was added.

Read more
@markmdev
Ships withmeridian

Meridian makes Claude Code more reliable on real projects. It adds persistent project context, smarter session handoff, and lightweight workflow enforcement so Claude is less likely to lose the plot halfway through a long task.

1876 skills8 agents
Get the whole plugin

Stars on GitHub

Momentum

stars in total
187
Star history of markmdev/meridian on GitHub, a chart by star-history.com

Other skills on meridian.

add-frontmatter

add-frontmatter

Scan all .md files in the project and add or fix YAML frontmatter (summary + read_when) so they can be discovered by context…

@markmdev@markmdevInstall Skill
create-docs

create-docs

Create or update .meridian/docs/ knowledge files for a module or directory. Produces reference docs with frontmatter for context…

@markmdev@markmdevInstall Skill
error-audit

error-audit

Audit code for silent error swallowing, fallbacks to degraded alternatives, backwards compatibility shims, and UI that fails to…

@markmdev@markmdevInstall Skill
observability-audit

observability-audit

Audit code for observability gaps — debug logs left in, errors caught without being logged, missing context on log entries,…

@markmdev@markmdevInstall Skill
planning

planning

Interview-driven planning methodology that produces implementation-ready plans. Always use this skill INSTEAD of EnterPlanMode —…

@markmdev@markmdevInstall Skill

More skills from other plugins.

brainstorming
Auto-invoked

brainstorming

You MUST use this before any creative work - creating features, building components, adding functionality, modifying behavior, or…

@obra@obraInstall Skill
ask-matt

ask-matt

Ask which skill or flow fits your situation. A router over the skills in this repo.

skills2w309k
@mattpocock@mattpocockInstall Skill
accessibility
Auto-invoked

accessibility

Design, implement, and audit accessible UI to WCAG 2.2 Level AA across Web, iOS, and Android — semantic ARIA roles and labels,…

ecc2w293k
@affaan-m@affaan-mInstall Skill
compiler-commit

compiler-commit

Use when you want to verify compiler changes and commit with the correct convention. Runs tests, lint, and format, then commits…

react5d252k
@facebook@facebookInstall Skill

Questions about ux-states-audit.

Which coding agents can use ux-states-audit?
ux-states-audit installs in Claude Code, Codex, Cursor, Gemini CLI, GitHub Copilot, OpenCode and Windsurf with the skills CLI, using each agent's flag shown on this page. Flowy's auto-invocation, which fires a skill when your prompt matches, runs in Claude Code only.