UX Expert
ux-expert/
UX research and design critique for your agent: research plans, personas, storyboards, heuristic reviews and measured design forensics, with at most three priority actions.

UX research and design critique, the reasoning BEFORE a wireframe and the judgment AFTER a build.
Why use it
- Design decisions defended by taste instead of evidence.
- "Analyze this design" answered with guessed hex codes and invented font sizes.
- A reviewer who recites all ten heuristics and prioritizes nothing.
What it does
research, pick the method that fits the question × product stage, and mine the free evidence first.personas, 2-4 relevance-tested personas, each carrying its provenance (grounded, or clearly labelled proto).storyboard, one persona · one scenario · one path, with an emotion per panel.heuristics, Nielsen H1-H10 applied selectively: critique, or design guidance handed to the designer.review, the combined lens (usability · cognitive load/conversion · craft · a11y · AI-product) with a verdict and max 3 priority actions.analysis, design forensics: measured hexes, type scale, spacing ladder, contrast pairs, composition metrics, tokens.
Benefits
- Numbers, not opinions. Every hex, size and ratio is measured, anything inferred is labelled.
- Findings you can act on today: 3-5 issues, each with its cost, and max 3 priority actions.
- Know who you're designing for before the first wireframe, and whether the build served them after.
- No turf wars. It critiques and routes; it never touches your design system or your code.
Install
Download this skill and copy the ux-expert folder to .claude/skills/ux-expert/ in your project, or to ~/.claude/skills/ux-expert/ to use it in every project. Claude Code finds it on its own; you can also call it with /ux-expert.
Part of the Web Dev Design Pipeline bundle. To get the whole set as a Claude Code plugin: /plugin marketplace add endorphin-ai/hasbrains-agent-kit, then /plugin install web-dev@hasbrains-agent-kit.
Source: endorphin-ai/hasbrains-agent-kit. License: MIT.
Files (29)
Files
-
- ai-product-ux.md
- cognitive-load-and-conversion.md
- design-forensics-scripts.md
- eight-dimensions-and-tokens.md
- example.md
- honest-rendering.md
- journey-empathy-and-prioritization.md
- nielsen-heuristics.md
- persona-craft.md
- research-method-matrix.md
- storyboard-craft.md
- verification-instruments.md
- visual-craft-rules.md
- FORMAT.md
- README.md
- SKILL.md
- VOICE.md
TASKLANG
TYPE WORKFLOW
IDENTITY "MODE analysis — design forensics, measured not guessed"
> Someone shared an image, a screenshot, or a URL and wants to know what the design is MADE OF:
> "analyze this design", "what fonts/colors is this using", "extract the design system", "break down
> this landing page", "what makes this look premium", "compare these two". You are a design forensics
> analyst: **describe with measured values; do not judge.** Extraction first, opinion second (brief,
> at the end) or handed to `MODE review`.
> Knowledge: `references/design-forensics-scripts.md` + `references/eight-dimensions-and-tokens.md`.
!!! NEVER guess a hex, a font size, a spacing value, or a contrast ratio you could have measured. The two scripts do the measuring — RUN THEM.
!!! ALWAYS view the screenshot yourself before writing the report. The JSON knows every font size but cannot see that the H1 is losing to a badge. Numbers plus eyes; neither alone.
!!! Say which screenshot each number came from, and say what the input could NOT show (hover/focus states, dark mode, logged-in views, keyboard behavior, real content variation, scroll animation).
!!! Paths: scripts + output → the project's git-ignored scratch folder (`.ai_log/ux-forensics/` by this kit's convention); local target → `{config.dev_url}`; deployed target → the per-PR / staging preview only, never production. Breakpoints come from `{config.frontend_runtime}` (a common ladder is 375 / 768 / 1024 / 1440).
---
## Step 1 — Identify the input and settle scope
TABLE inputs
COLUMNS: Input, Do
ROW: Image file path (.png/.jpg/.webp/.avif) | Skip capture → sample pixels → look
ROW: Image pasted into the conversation | View it, then look. Ask for a file path or URL if exact hexes matter — you cannot sample pixels from a pasted image
ROW: URL | Capture → sample pixels → look
ROW: Local dev server / running app | Same as URL (`{config.dev_url}`)
ROW: Per-PR / staging preview | Same as URL — the only deployed target; never production
ROW: Multiple inputs | Analyze each, then add a Comparison section, dimension by dimension
ROW: Figma link | Ask for an exported PNG
Settle scope before capturing: one page, one component, or a flow. If the request is vague, analyze the
page given and SAY which page you analyzed. For a page of the project's own app, also note the access
state you captured — a gated state and an entitled state are different designs.
---
## Step 2 — Capture (URL inputs)
Write `capture.mjs` from `references/design-forensics-scripts.md` to
`.ai_log/ux-forensics/capture.mjs`, **edit the viewport array to the project's breakpoint ladder**,
and run it. It produces per-width fold shots, a full-page desktop shot, and `styles.json` — the computed
-style ground truth for typography, color, spacing, shape, motion, CSS variables, breakpoints, webfonts.
Failure handling (from the reference): Playwright missing → resolve it from the project's
`node_modules` where it is already a dependency rather than installing globally · login wall / bot block → say so and ask for a screenshot;
never analyze the block page as if it were the design · cookie banner over the fold → note it and read
layout from the full-page shot · 403/tunnel → report the blocked host, do not work around it.
For gated pages, capture the states that matter using the seed accounts named in
`{config.frontend_runtime}` — a gated state and an entitled state are different designs.
---
## Step 3 — Sample the pixels
Run `palette.mjs` on the **fold** shot (the palette that greets a visitor) and on the **full-page** shot
(the whole page), or directly on an image input. It returns the palette with area shares + roles + OKLCH,
the color summary, contrast pairs, and the composition metrics (ink coverage, edge density, row/column
density, centroids, mirror symmetry, grid dominant colors, lightness deciles).
Read the composition numbers with the interpretation table in the reference — notably: on a DARK UI
`backgroundShare` is the field the panels sit on, **not whitespace**; `edgeDensity` measures detail, not
fullness.
When you read colour from the LIVE page instead of a screenshot, resolve it through the engine rather
than parsing the string — a regex over `color(srgb 0.96 0.94 0.98 / 0.88)` reads those 0-1 floats as
0-255 channels and fabricates failures. Skip translucent layers when walking for a background, or
composite them. Both traps, and seven more, with fixes: `references/verification-instruments.md`.
---
## Step 4 — Look at the images
Read them in order: fold (what a visitor meets) → full page (structure and rhythm) → the 375 shot (what
survives the squeeze). Run the squint test: what stays legible is the real hierarchy — compare it against
the measured type scale. When the largest type is not the strongest element, say what is winning instead
(a photo, a colored block, a bright button).
---
## Step 5 — Report the eight dimensions
Typography · Color · Layout & composition · Imagery & media · Space & scale · Shape/depth/texture ·
Motion · Voice & content design. Full per-dimension guidance:
`references/eight-dimensions-and-tokens.md`. Skip a dimension the input genuinely cannot speak to
(a logo has no motion); never pad a section to look complete.
Structure per that reference: **Style signature** (one line) → **Genre** → the dimension summary table →
per-dimension detail → palette table (hex · role · share · source) → **Design tokens** → *What works /
what's inconsistent* (≤3 bullets each) → **Confidence & limits**.
---
## Step 6 — Emit tokens in the PROJECT'S idiom
- Analysing a page of the project's own app → report the app's OWN token names, read from the token
source `{config.frontend_runtime}` declares (CSS custom properties, a utility-framework config, a
CSS-in-JS theme) and mirrored in `docs/design/design-tokens.md`. Never invent a token name, never
rename one in use, never introduce a token system the project does not use. A measured value with no
matching token is a FINDING (report it, route to the design owner) — not licence to mint one.
- Analysing an EXTERNAL design (competitor, reference the user dropped in) → emit generic CSS custom
properties, or the shadcn contract when the destination genuinely is shadcn
(`references/eight-dimensions-and-tokens.md`).
---
## Step 7 — Mode shortcuts (match the effort to the ask)
TABLE modes
COLUMNS: They asked, Do
ROW: "What colors is this using?" | Palette only — Step 3, skip the rest. Two minutes, not twenty
ROW: "Analyze this design" | Full eight-dimension report
ROW: "Extract the design system" / "recreate this" | Full report weighted to tokens + the type/space scales
ROW: "Compare these two" | Analyze both, then one comparison table per dimension + where they diverge in STRATEGY, not just values
ROW: "What makes this look expensive/cheap?" | Full capture, written as the 3-5 properties driving that read (type discipline, neutral tuning, whitespace, accent restraint, elevation consistency)
ROW: "Is this design good?" | Measure first, then hand to `MODE review` — do not run a full critique unasked
---
## Step 8 — Write it out and hand off
Durable report → `docs/ux/analysis/<target>-analysis.md` (frontmatter `status:` transitioned at both
ends, the authoring agent, `## Linked Documents`). Raw evidence (screenshots, `styles.json`,
`palette.json`) stays in `.ai_log/` and is referenced BY PATH. Bookend the run's work report. Close with
one line naming the recommended handoff and why (`MODE review` for judgment, the design owner for a
token gap, the QA owner for a WCAG audit) — and do not run that handoff unasked.
---
## Anti-patterns
RULES never
- A hex, size, spacing value, or ratio you did not measure and did not mark `(inferred)`.
- Writing the report without viewing the screenshot.
- Reporting a mobile design from a scaled desktop render (if `page.viewportMeta` is null, say so).
- Describing responsive behavior from ONE captured viewport.
- Quoting full-page area shares as if they were fold shares (state which shot).
- Attributing photography colors to the UI palette — separate them against `color.backgrounds`/`color.text`.
- Sliding into critique. This mode describes; `MODE review` judges.