Evidence-based UX review for UI code and live pages...
Review interfaces the way a senior UX engineer would: measure first, cite the principle behind each problem, be honest about how strong that principle's evidence is, and hand back fixes as code.
What sets this apart from opinion-based design review:
Pick the mode from the request. Default to review.
Identify what is being reviewed: files, a URL, a running dev server or screenshots. Then name the primary user task on this screen (for example "sign up for a trial" or "find and buy a product"). Every finding is judged by how much it gets in the way of that task. If it isn't obvious from the code and copy, state your assumption in the report instead of asking.
Use the measurement script if you have a URL, a local HTML file, or a project with a dev server you can start:
node <skill-dir>/scripts/measure.mjs <url-or-file> --out=ux-lint.json --screenshots=ux-lint-shots
Useful flags:
--viewport=mobile|desktop|both (default both).--click="<selector>", repeatable, times a specific interaction such as a submit or add-to-cart. The script never clicks anything unless you ask, so it is safe on pages with destructive actions.--wait=<ms> gives slow client-side apps time to hydrate.If Playwright is missing, the script prints the install command (npm i -D playwright && npx playwright install chromium). Run it if you are allowed to install dev dependencies; otherwise continue with a static review and say so.
Read the script's summary output. Then look at the screenshots if you can view images, because the Gestalt principles (grouping, similarity, hierarchy) are judged visually.
Rules for interpreting the numbers:
If you need to start a dev server yourself, look for a dev or start script in package.json, run it in the background, wait for the port, and measure http://localhost:<port>/<route>. Stop it afterwards.
Measurement covers what renders. Code reading covers behaviour and intent. Open the components behind the reviewed screen and check the principles relevant to what you see, using references/principles.md. Load only the sections you need; each entry lists what to look for and typical fixes. If the user asks where a principle comes from, cite the primary source from references/sources.md.
Things only a code read catches:
references/sources.md.Merge measured and code findings. Deduplicate: one root cause gets one finding, even if the script flagged it 12 times; list the affected elements inside it.
Then check your own confirmation bias. For every blocker and major, look for evidence against it before keeping it: Is it deliberate? Does the measurement really show it? Would it matter for the main task? Drop or downgrade anything that doesn't survive.
Rank by impact on the main task:
Use this structure for review mode:
# ux-lint: <what was reviewed>
**Main task:** <assumed or stated primary task>
**Method:** <measured at mobile 390ร844 + desktop 1440ร900 | static code review only> ยท <files/URL>
**Result:** <n> blockers ยท <n> major ยท <n> minor
## Findings
### ๐ด Blocker: <short, specific title>
- **Principle:** Fitts's Law (strong evidence)
- **Where:** `src/components/Header.tsx:42` ยท `header .icon-btn`
- **Evidence:** measured 18ร18px, 4px from the next target (mobile)
- **Impact:** <one sentence on what happens to the user>
- **Fix:**
```diff
- <button className="icon-btn">
+ <button className="icon-btn min-h-11 min-w-11 p-3">
<2โ4 bullets on things done well, with the principle, so the team keeps doing them>
<what couldn't be verified and why, e.g. "logged-in flows (no credentials)">
For **check** mode, keep it short:
```markdown
# ux-lint check: <scope>
| Check | Result | Note |
|---|---|---|
| Targets โฅ 24px or spaced (WCAG 2.5.8) | โ
/โ | โฆ |
| One primary action per view | โ
/โ | โฆ |
| Every field has a visible label | โ
/โ | โฆ |
| Labels group with their own field | โ
/โ | โฆ |
| No overlay blocks first interaction | โ
/โ | โฆ |
| Async actions give feedback < 100ms | โ
/โ | โฆ |
| Core interaction < 400ms | โ
/โ/โ | โฆ |
| No horizontal scroll on mobile | โ
/โ | โฆ |
| Large animations respect reduced motion | โ
/โ/โ | โฆ |
| No manipulative defaults or urgency | โ
/โ | โฆ |
**Verdict:** ship / ship with follow-ups / fix first
references/principles.md (strong / moderate / mixed / heuristic). Never flag a menu for having more than 7 items under "Miller's Law". That law concerns memory, not visible options. Don't present Choice Overload as settled science. For the Zeigarnik effect, a 2025 meta-analysis found no general memory advantage for unfinished tasks, only a tendency to resume them, so design for resumption.Hero.tsx:18โ24; make 'Start trial' primary and the others secondary" is.measure.mjs on the same URL and viewports, and report before/after numbers for each fixed finding.