code/ux-interview/SKILL.md
Plays the role of a real user in an interview-style usability test. Takes context about the product (URL, description, focus areas), auto-suggests a persona (overridable), then drives real Chrome via the claude-in-chrome extension to explore the product think-aloud style — narrating live reactions while flagging confusion, friction, and delight, and capturing GIFs/screenshots of the friction moments. Produces a structured UX report with severity-ranked pain points, what worked, and prioritized recommendations. Learns over time which findings the user considers signal vs noise. Use when you want a real-user-perspective audit of a web product to catch UX/UI/product issues that automated tests can't catch.
npx skillsauth add mostafa-drz/claude-skills ux-interviewInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
Play a real user in an interview-style test of a web product. Narrate think-aloud reactions live as you click, scroll, and try to accomplish realistic goals — then deliver a structured report with severity-ranked findings, delight moments, and prioritized recommendations.
This skill is not an automated test runner (see /ui-test for that). It is a qualitative user-perspective audit. Findings are based on judgement, not assertions.
On startup, use the Read tool to load ~/.claude/skills/ux-interview/preferences.md. If missing, treat as first-run (see First-time detection).
Defaults when no preferences exist:
output-root: ./ux-interviews/ (cwd-relative when in a project; falls back to ~/.claude/skills/ux-interview/runs/ otherwise)default-depth: standard (quick ≈ 5–7 min walkthrough / standard ≈ 12–18 min / deep ≈ 25 min+ with multiple flows)narration-style: expressive (expressive — feels like a real user / neutral — observational / terse — short notes only)persona-mode: auto-suggest (auto-suggest with override / always-ask / fixed-default)severity-floor: minor (nitpick / minor / moderate / major — anything at-or-above is reported)capture-mode: friction-only (friction-only / per-section / never) — when GIFs/screenshots are takenviewport: 1440x900 — also accepts a list (e.g. 375x812,1440x900) to test responsiveconfirm-plan: always (always / never) — confirm the test plan before opening the browserauto-open-report: trueAlso load ~/.claude/skills/ux-interview/feedback-journal.md if present — surface the latest 5 Signal: lines to bias defaults (e.g. if the user repeatedly downgraded "minor copy issues", raise the severity floor pre-selection).
On startup, use Bash to detect: today's date+time (date +%Y-%m-%d-%H%M), the current working directory (pwd), and whether the configured output-root exists. Do NOT call any browser tool yet — that happens in Step 4.
Check $ARGUMENTS:
help → display help, stopconfig → run config flow, stopreset → delete preferences.md + feedback-journal.md + sessions/ + resume-state.md, confirm, stopfeedback → collect ratings on the most recent session (see Feedback section), stophistory → list recent session folders with verdict + timestamp, stopresume → reopen resume-state.md and continue an interrupted session, stop on completion--from-brief <path> → read the brief from a markdown file, run the session$ARGUMENTS as an inline brief (URL + free-text description), run from Step 1ux-interview — Real-user-perspective UX testing via real Chrome
Usage:
/ux-interview "<url> <brief>" Inline brief, runs the session
/ux-interview --from-brief <path> Load brief from a markdown file
/ux-interview resume Resume an interrupted session
/ux-interview history List recent sessions (verdict + date)
/ux-interview feedback Rate the last session (teaches the skill)
/ux-interview config Set preferences
/ux-interview reset Clear preferences + journal + sessions
/ux-interview help This help
Per-run flags:
--persona "<who>" Override the auto-suggested persona
--focus "<areas>" Comma-list of areas/flows to prioritize
--depth quick|standard|deep
--viewport <WxH[,WxH]> Single viewport or comma-list for responsive
--no-narration Skip live think-aloud, only output the final report
--no-gif Disable GIF capture
--severity-floor <nitpick|minor|moderate|major>
--verbose
Examples:
/ux-interview "https://stripe.com — checkout flow + nav clarity"
/ux-interview --from-brief ./brief.md --persona "non-technical small-biz owner"
/ux-interview "https://acme.app/signup --focus signup,onboarding --depth deep"
Output: {output-root}/{YYYY-MM-DD-HHMM}-{slug}/ contains
report.md, brief.md, transcript.md, findings.json, captures/.
Current preferences:
(loaded from preferences.md)
Use AskUserQuestion to collect (max 4 per call):
Batch 1 — Output & defaults
./ux-interviews/)quick / standard / deep)auto-suggest / always-ask / fixed-default)expressive / neutral / terse)Batch 2 — Capture & strictness
5. Severity floor (nitpick / minor / moderate / major)
6. Capture mode (friction-only / per-section / never)
7. Default viewport (e.g. 1440x900 or 375x812,1440x900)
8. Confirm plan before browser (always / never)
Save to ~/.claude/skills/ux-interview/preferences.md in the three-tier format below.
# /ux-interview preferences
Updated: YYYY-MM-DD
## Defaults
- output-root: ./ux-interviews/
- default-depth: standard
- narration-style: expressive
- persona-mode: auto-suggest
- severity-floor: minor
- capture-mode: friction-only
- viewport: 1440x900
- confirm-plan: always
- auto-open-report: true
## Profile (optional — edit freely)
- I usually test B2B SaaS — bias personas toward time-pressed admins.
- Skip nitpicky copy issues unless they actually block comprehension.
## Learned
- (populated from feedback over time)
Delete preferences.md, feedback-journal.md, sessions/, and resume-state.md. Confirm: Cleared. Defaults + journal + sessions wiped.
If no preferences.md exists:
First time using
/ux-interview? Run/ux-interview configto set defaults — or just continue and I'll use sensible ones.
Then proceed.
Read preferences.md and feedback-journal.md (graceful: if missing, continue with defaults). Note any Learned rules — they pre-bias the choices in Steps 2–6 (persona pick, severity floor, narration style).
Inputs may come from: $ARGUMENTS inline string, --from-brief <path>, or interactive prompt. The brief should answer:
If any are missing, ask via AskUserQuestion (≤4 questions in one batch). Pre-select based on Learned rules.
Save the parsed brief to {session-dir}/brief.md.
Based on the product description + focus areas, propose a persona that's likely to surface real issues. A persona is 3–5 lines:
Per persona-mode:
auto-suggest: present the suggested persona via AskUserQuestion with options Use it / Tweak it / Pick a different onealways-ask: skip the suggestion, prompt the user for the personafixed-default: use the persona stored in preferences.md ProfileSave the chosen persona to {session-dir}/brief.md under ## Persona.
Draft a short test plan (5–10 bullet points) covering:
If confirm-plan: always, present the plan and ask one AskUserQuestion to approve, tweak, or restart. If confirm-plan: never, log the plan to the transcript and proceed.
Save the plan to {session-dir}/transcript.md under ## Plan.
Open a fresh Chrome tab via mcp__claude-in-chrome__tabs_create_mcp (call tabs_context_mcp first if you don't have a current tab). Set viewport via resize_window. Then walk the plan.
For each step:
navigate, find, computer (click/scroll/type), form_input for forms.read_page or get_page_text for content; read_console_messages if something looks broken.[delight] — something exceeded expectations[friction] — slow, awkward, or required guessing (severity: nitpick / minor / moderate / major)[confusion] — couldn't tell what to do, where to go, or what something meant[bug] — broken or behaved unexpectedly[neutral] — noted but no judgementcapture-mode):
friction-only → call gif_creator only on friction/confusion/bug momentsper-section → capture a short GIF for each major flow transitionnever → skip capture
Save captures under {session-dir}/captures/.Append every reaction to {session-dir}/transcript.md as a timestamped line:
[HH:MM:SS] [tag/severity] (location) "narration" — observation
Stop conditions — end early if:
If the session is interrupted (user halts, browser disconnect), save resume-state.md with the current step + transcript pointer.
After exploration:
severity-floor — anything below the floor goes to ## Below floor (kept but not promoted).[delight]).(severity × confidence) / effort (effort guessed: low/med/high).Save structured data to {session-dir}/findings.json.
Write {session-dir}/report.md with this structure:
# UX Interview — {product name} — {date}
## Verdict (one paragraph)
Persona "{persona-summary}" tried to {goal}. Outcome: {succeeded / partially / abandoned}. {1–2 sentences on overall feel}.
## Top friction (severity ≥ {floor})
1. **{Title}** — {severity} · {confidence} · {type}
What happened: {…}
Why it matters: {…}
Where: {URL or location} ({capture link if any})
Suggested fix: {…}
## What worked
- {delight moment 1}
- {delight moment 2}
## Prioritized recommendations
| # | Issue | Severity | Effort | Impact |
|---|-------|----------|--------|--------|
| 1 | … | major | low | high |
## Persona & plan
{persona block}
{plan bullets}
## Full transcript
See `transcript.md`.
## Captures
See `captures/` ({N} files).
If auto-open-report: true, run open {session-dir}/report.md.
Print to chat:
{N} major, {M} moderate, {K} minor; {D} delight moments)report.mdAskUserQuestion: What's next? — Open report / Run another persona on the same product / Try a different flow / DoneThen add the line:
Run
/ux-interview feedback— even one rating helps me sharpen which findings are signal vs noise for you.
Append a session log to ~/.claude/skills/ux-interview/sessions/{YYYY-MM-DD-HHMM}.md with the brief, persona, plan summary, finding counts by severity, and a 1-line verdict. This is what feedback reads.
When invoked as /ux-interview feedback:
sessions/YYYY-MM-DD-HHMM.md. If none, say No recent session found. and stop.AskUserQuestion (4 questions in one batch):
spot-on / close / off)mostly real / mixed / mostly noise)right / too harsh / too lenient)right / too shallow / too deep)~/.claude/skills/ux-interview/feedback-journal.md:
## {session slug} — {date}
- Persona fit: {answer}
- Findings quality: {answer}
- Severity calibration: {answer}
- Depth: {answer}
- Signal: {one-line generalisation, e.g. "User wants severity floor raised for B2B SaaS — they keep flagging minor copy as noise"}
Signal, promote it to ## Learned in preferences.md. Mention once: Noticed you consistently {…}. Saved as standing default.Learned rule is contradicted in 2 newer sessions, demote it (log the demotion in the journal).Pre-selection in Step 2's persona question and Step 5's severity-floor application should be biased by Learned rules.
nitpick, not major. Inflating severity ruins the signal.preferences.md / feedback-journal.md can't be read; skip captures if gif_creator fails; don't abort the whole session for one tool error.resume-state.md and exit cleanly. Don't keep poking the browser.development
--- name: triage-board description: >- Generates a structured triage artifact from the current conversation's findings — a self-contained Desktop folder with a JSON Schema, schema-conformant report.json, prose markdown, and a single-file HTML viewer. Viewer ships with MD / CSV / JSON download buttons in the header and a per-finding "Copy as Markdown" action that produces a GitHub/Linear/Notion-ready ticket block. Stateless — triage state lives in the user's ticket system, not in the
development
Runs a beginner-mind end-to-end UI audit of any running app — local dev server, staging, production, or a specific URL. Drives Chrome through every interactive element on the target surface, collects structured findings (severity, category, where, symptom, impact, repro, triage), and hands the result off to `/triage-board` which produces the Desktop folder (schema + JSON + Markdown + single-file HTML viewer with MD/CSV/JSON exports and a per-finding Copy as Markdown button). Use when you want fresh-eyes verification of a feature, page, modal, flow, branch, or whole app — before shipping, before review, before a demo, or any time the UI deserves a careful poke.
development
Reviews the user's past Claude Code conversations from a wellbeing perspective — sentiment, tone, emotional arc, recurring patterns — and generates a supportive, science-grounded report in both Markdown and HTML. Default lookback is 48 hours across all projects. Uses recognised emotion frameworks (Plutchik, Ekman, Russell's circumplex, Pennebaker linguistic markers) and cites the science behind every observation. Learns the user's baseline tone over time so future reports flag genuine shifts, not noise. Use when the user asks for an emotional/wellbeing recap, mood check, sentiment review, or wants to understand their own ups and downs across recent work sessions.
development
--- name: workflow-advisor description: >- Analyzes recent Claude Code conversations and local Claude state (skills, settings, memory files, CLAUDE.md), researches the latest Claude Code features and best practices online, and suggests one workflow improvement at a time with reasoning and a concrete action item. Can save accepted suggestions to memory for tracking. Use when you want to discover underused Claude Code features, improve your development workflow, stay current with the lat