jezweb/ux-extract
Exhaustively extract UX patterns from a reference web app. Walks every screen, captures screenshots of every state, records interaction patterns, copy verbatim, keyboard shortcuts, responsive treatments, motion, and empty/error/loading states. Produces a reusable pattern library that other audits can compare against. The inverse of ux-audit — asks 'what is the bar?' rather than 'does this match the bar?'. Trigger with 'learn from X', 'extract patterns from X', 'study X's UX', 'reverse engineer the UX of X', 'build a pattern library from X'.
npx skills add https://github.com/jezweb/claude-skills --skill ux-extract
Exhaustively study a reference web app and produce a reusable pattern library. Goes everywhere, captures everything, then organises it into a document another audit or build can reference.
The inverse of ux-audit:
Audits without extracts implicitly compare to "my memory of other apps" — fragile and inconsistent. Extracts turn that memory into a concrete, navigable artifact. An audit can then say: *"Empty state on /app/clients shows no CTA. Reference (claude.ai) shows 3 keyboard shortcuts plus 'New chat' in the same position"* instead of *"feels a bit sparse"*.
Before starting, confirm the target is fair game:
robots.txt for unauthenticated crawlingIf the target is behind a paywall or requires a trial account, ask the user whether they have legitimate access before proceeding.
| Target | Tool | Notes |
|--------|------|-------|
| Authenticated reference (you have an account) | Chrome MCP | Uses your logged-in session |
| Public reference (marketing pages, docs, public demos) | Playwright MCP | No login needed |
See ../ux-audit/references/browser-tools.md for commands.
Pin 1440×900 as baseline (MacBook standard). Also capture 768 and 375 for responsive patterns. Don't exceed 2000px wide.
On Retina Macs, Chrome captures at 2× the logical viewport — a 1440-wide window produces a 2880-wide PNG. Post-process after each batch so the library isn't full of oversized files:
img-process batch ./screenshots --action optimise --max-width 1440
Idempotent — no-op on already-small files. Run at the end of each route's capture, or across the whole screenshots/ folder at the end of the extract. Playwright MCP users can set deviceScaleFactor: 1 in the context options and skip this step.
Decide before starting:
Narrower scope produces tighter, more useful libraries. "Whole app" is only worth it for apps you'll be building a direct analogue of.
Optional bias for capture. Examples:
If no focus is given, capture broadly.
Build the full route inventory:
/sitemap.xml, /robots.txt for discoverability/settings, /preferences, /admin that aren't in the main navRecord each route with its purpose: /settings/billing — subscription plan, payment method, invoice history.
Before deep-capture, scan the app once and list pattern types you'll document. Typical categories:
Not every app uses every category. Mark which apply.
For each route, capture exhaustively. Screenshots are cheap — err toward more.
Per meaningful element, capture:
| State | Trigger |
|-------|---------|
| Default | page loaded, nothing interacted with |
| Hover | mouse over a button, row, nav item |
| Focus | keyboard-focused via Tab |
| Active | button mid-click, input being typed into |
| Open | dropdown open, menu expanded |
| Closed | dropdown closed, menu collapsed |
| Expanded | accordion open, detail panel expanded |
| Collapsed | accordion closed |
| Selected | checkbox ticked, row selected, tab active |
| Loading | skeleton, spinner, pending state |
| Empty | list with no items |
| Populated | list with many items |
| Error | inline, toast, or full-page error |
| Success | post-action confirmation |
See references/capture-checklist.md for the full per-pattern checklist.
Copy the text exactly, including punctuation, ellipses, and tone:
"Start chat", "Upgrade plan", "Delete forever""e.g. [email protected]""Pressing Cmd+K opens this from anywhere"Raw copy is gold for writers and informs your app's voice.
For each interactive element, note:
? or Cmd+/ that reveals the shortcut list? Capture it.Cmd+K or similar? Capture the palette open, searching, a result selected, and an action executed.For each route, screenshot at 1440, 768, 375. Note what changes, not just "it works":
Record a GIF (Chrome MCP's gif_creator) of any animation worth documenting:
One 3-second GIF is worth a paragraph of description.
After capture, many patterns will appear on multiple pages. Deduplicate:
Keep two counts per pattern:
A pattern that appears once is rarely worth documenting unless it's unique and notable.
Write to docs/ux-extracts/<app-name>/ (or .jez/artifacts/ux-extracts/<app-name>/ if that directory exists):
docs/ux-extracts/claude-ai/
├── pattern-library.md ← main document
├── copy-corpus.md ← optional, raw copy by page (for writers)
└── screenshots/
├── 001-home-default.png
├── 002-home-hover-cta.png
├── 003-new-chat-empty.png
└── ...
See references/pattern-library-template.md for the output structure.
The pattern library should be:
ux-audit checks for pattern libraries at .jez/artifacts/ux-extracts/<ref>/pattern-library.md or docs/ux-extracts/<ref>/pattern-library.md. If found, it uses them as the bar for comparison. Audit findings can then cite specific patterns:
> *"Empty state on /app/clients has no explanatory copy and no CTA. Reference library [claude.ai § Empty States] shows CTA + 2 example prompts in the same position."*
No integration is required beyond producing the library in the expected path.
| When | Read |
|------|------|
| Building the pattern-library.md output | references/pattern-library-template.md |
| Per-pattern capture checklist (what to screenshot, what to note) | references/capture-checklist.md |
| Browser tool commands | ../ux-audit/references/browser-tools.md |
Take jezweb/ux-extract from the repository into ~/.claude/skills for personal
use, or into .claude/skills inside a project.
The agent identifies a skill by the name field in its header. Two skills with the
same name cannot sit side by side — one of them will be ignored.