Author: Aniket Shukla
Date: 4 September 2026
Subject: How the ui-ux-pro-max AI skill was evaluated and used to produce a
monitoring-product landing page, and what the method is worth repeating.
| Path | What it is |
|---|---|
README.md |
This document — the method, commands and measured findings. §11 is a copy-pasteable prompt appendix for Cursor. |
docs/retrofit-playbook.md |
Applying the same tool to an existing dashboard. Different workflow. |
tools/contrast-audit.py |
Reusable WCAG contrast auditor for CSS custom properties. Exits non-zero, so it drops into CI. |
examples/kymo-landing.html |
The landing page produced by the method in §6–8. Self-contained, no build step. |
Quick start:
python3 tools/contrast-audit.py path/to/globals.css
open examples/kymo-landing.htmlThis document records the exact process used to evaluate the open-source
ui-ux-pro-max skill and apply it to a real design deliverable. It is written so
a colleague can reproduce the work without re-deriving any of the research.
Two deliverables came out of the session:
| Deliverable | What it is |
|---|---|
| Kymo landing page | A marketing landing page for a fictional observability product. This is the build documented in detail below. |
| Dashboard Retrofit Playbook | A separate reference doc for improving an existing monitoring dashboard. Different workflow; summarised in §9. |
A note on terminology: the artifact produced was a landing page for a monitoring product, not a monitoring dashboard. The retrofit playbook is the piece that addresses an actual dashboard UI.
Repository: https://github.com/nextlevelbuilder/ui-ux-pro-max-skill (MIT, ~125k stars, actively maintained — last commit 3 September 2026)
A local, offline design catalogue queried through a Python script. It is not a model or an API. It ships CSV data and a BM25 keyword search over it:
- 192 product colour palettes
- 79 visual styles (50 active)
- 74 font pairings + 1,934 Google Fonts with metadata
- 119 UX guidelines
- 25 chart types
- 34 landing-page patterns
- 22 technology stacks
The scripts are standard-library Python only. They were audited before use: no
subprocess, no eval, no network calls, no filesystem writes outside the
explicit --persist flag.
npm install -g ui-ux-pro-max-cli
cd /path/to/project
uipro init --ai cursor # writes .cursor/skills/
uipro init --ai cursor --global # or ~/.cursor/skills/ for every projectPackage-name warning. Two npm packages install a binary called
uipro.ui-ux-pro-max-cliis current (2.15.0, published 2026-08-13).uipro-cliis stale (2.2.3, published 2026-01-29). Installing the wrong one fails silently — you get answers, just seven months out of date.
Python 3 must be on PATH. Confirm the skill is actually firing before trusting anything it says:
uipro search "dialog focus trap" --stack shadcnExpect CSV fields — Guideline, Do, Don't, Severity, Docs URL. If those
are missing, the agent is improvising rather than querying the catalogue.
The CLI also targets Windsurf, Copilot, Codex, Gemini CLI, Continue and others
via --ai <name>; run uipro init --help for the full list.
Seven skills install, not one. Their approximate context cost:
ui-ux-pro-max ~130 always-on / ~3.9k on-invoke <- the only one worth keeping
design ~170 / ~3.1k
ui-styling ~130 / ~2.5k
banner-design ~120 / ~1.6k
design-system ~80 / ~1.8k
brand ~50 / ~800
slides ~40 / ~360
~709 tok always-on for the full set
To trim in Cursor, delete the unused directories under .cursor/skills/ after
uipro init. The figures above were read from the plugin inventory of an
equivalent install; treat them as indicative rather than exact for Cursor.
Provenance note. The measurements throughout this document were captured against the same catalogue and the same
search.py, installed through Claude Code's plugin system rather than the Cursor CLI. The data files and the script are identical between the two, so the numbers carry over; only the install path and the invocation wrapper differ.
The plugin installs seven skills. Only one was used.
| Skill | Used? | Reasoning |
|---|---|---|
ui-ux-pro-max |
Yes | The searchable catalogue. The only component with real data behind it. |
ui-styling |
No | shadcn/Tailwind implementation help; the deliverable was hand-written CSS. |
design-system |
No | Token architecture; overlapped with what --design-system already emits. |
design, brand, slides, banner-design |
No | Logo/CIP/slide/banner generation — out of scope. |
A second, separate design-quality process was applied before any HTML was
written. ui-ux-pro-max supplied data; that process supplied judgement.
Neither substitutes for the other, and the distinction is the single most
important thing in this document.
In the original session this came from Anthropic's artifact-design skill, which
is not available in Cursor. There is no drop-in equivalent, so in Cursor it
has to be applied as explicit practice. Its substance is short enough to state in
full:
- Write a design plan before any code — palette as 4–6 named hex values, two or more type roles, and a one-sentence layout concept. Build only from the plan.
- Ground every choice in the subject. Distinctive decisions come from the subject's own world — its instruments, materials and vocabulary — not from a catalogue of styles.
- Review the plan for genericness before building. If a part of it is what you would produce for any similar page, revise that part and note why.
- Structure both themes at token level. Light palette on bare
:root; dark redefines only the tokens. Never declare a colour solely inside a media query. - Reject the known generic AI looks, which is what the catalogue will hand you: near-black with a lone acid-green accent; warm cream with a serif display and terracotta; purple-to-blue gradient heroes; Inter or Space Grotesk as the safe face.
Paste those five points into your Cursor prompt. Step 3 and step 5 are the ones that stop you shipping the catalogue's median answer.
The catalogue was measured before being trusted. This step is the most reproducible value in the whole exercise and is recommended before adopting the tool on any project.
Ten realistic component queries were run against each stack and hits counted.
| Stack | Hit rate | Interpretation |
|---|---|---|
shadcn |
10/10 | Densest stack file. 68 rows organised per component. |
html-tailwind |
6/10 | Good for layout and utility questions. |
react-native |
6/10 | 51 rows. No coverage of safe areas, insets or bottom sheets. |
react |
2/10 | Not a gap — that file is React idioms and performance, not components. |
Routing conclusion:
- component behaviour →
--stack shadcn - layout / utilities →
--stack html-tailwind - rerenders, memo, effects →
--stack react
All 192 palettes were extracted and every foreground/background pair scored for WCAG contrast.
1,344 text pairs checked — 0 below 4.5:1 (100% pass)
This is the strongest evidence for the tool. The palettes are genuinely
validated, not generated by feel. Example: for an emerald primary it specifies
black on #059669 (5.57:1) where the intuitive white would fail at 3.77:1.
Non-text contrast (WCAG 1.4.11, 3:1 for UI boundaries) is not validated:
Border on Background : 173/173 below 3:1 median 1.22:1 best in set 2.39:1
Border on Card : 173/173 below 3:1 median 1.26:1
Ring on Background : 0/192 below 3:1 median 5.31:1
Read precisely: a hairline divider is decorative and legitimately exempt, and the focus-ring result shows the authors deliberately validated non-text contrast where the standard strictly requires it. But wherever a border is the only thing separating two data rows or marking a control edge, the catalogue default will not survive a bright room. Raise those specific borders manually.
The search is lexical BM25, not semantic. It matches vocabulary, not meaning.
| Query | Result |
|---|---|
"FlatList" |
Hit |
"list performance" |
0 results — same row |
"toast notification" |
Hit |
"alert notification urgency" |
0 results — nothing in the corpus covers alerting |
Practical rules: two to five concrete terms, one intent per query, always pass
--domain or --stack explicitly, retry once narrower on a miss then stop.
Its best property: on zero results it returns an explicit "did not hit the database" and instructs the agent not to fabricate. Hold your agent to that.
The CLI wraps the search script, so in Cursor the invocation is:
uipro search "observability monitoring developer tool infrastructure" \
--design-system --variance 8 --motion 4 --density 6 -p "Landing"To call the script directly — useful when scripting or when you want the agent to
show raw output — it sits under the skill directory that uipro init created:
.cursor/skills/ui-ux-pro-max/scripts/search.py
SKILL.md recommends always invoking by full path rather than relying on the working directory.
The three dials are the highest-leverage flags in the tool:
| Dial | Range | Effect |
|---|---|---|
--variance |
1 centred/minimal → 10 bold/asymmetric | Biases style category |
--motion |
1 subtle → 10 complex | Attaches a matching GSAP snippet |
--density |
1 spacious → 10 dense/dashboard | Rewrites the spacing scale |
PATTERN FAQ/Documentation Landing
(Hero with search bar / Popular categories / FAQ accordion / Contact CTA)
STYLE Brutalism
COLORS Primary #1E293B Accent #22C55E
Background #0F172A Notes: "Code dark + run green"
TYPOGRAPHY JetBrains Mono / IBM Plex Sans
At its boldest setting (--variance 8) the tool returned the single most
templated developer-tool aesthetic in existence: near-black plus acid green
plus JetBrains Mono. The page pattern was also misrouted — an FAQ/documentation
structure was returned for a product landing page.
This is structural, not a defect. The tool is a convergence engine: a catalogue lookup over 192 palettes and 34 patterns necessarily returns the median, validated answer. A lookup table cannot produce a distinctive concept. Asking it for originality is asking it for the one thing its architecture excludes.
Operating conclusion: use it as a checker, not a generator.
| Kept from the skill | Rejected |
|---|---|
on-* token discipline (every accent ships a validated foreground) |
Its palette — a known generic AI look |
| WCAG contrast thresholds | Its font pairing — the safe default |
"Never rely on colour alone" (from --domain chart) |
Its page pattern — misrouted and wrong for the brief |
prefers-reduced-motion, visible-focus requirements |
Its section order and CTA placement |
With the skill's aesthetic output rejected, a design plan was written first, per the judgement-layer process set out in §4.1.
Concept. Monitoring rendered as a paper chart recorder (kymograph), rather than a dark console. The hero is a live HTML Canvas trace that runs flat and occasionally spikes — the product's thesis in one moving line, instead of the customary dashboard screenshot.
Colour. Instrument paper #E9EBE6, graphite ink #1A1D19, oxblood trace
#A32218. Chart recorders use red ink, so red is the brand colour. Severity is
therefore encoded in mark shape — circle, diamond, triangle — not a second
colour. This both matches how paper recorders work and satisfies the rule that
semantic state must stay separate from the accent hue.
Type. Archivo 900 (industrial display) / Newsreader (serif body) / IBM Plex Mono (readouts). The serif body is the deliberate risk: no developer-tool landing page uses one, but instrument documentation does.
Structure. Sections are spined on timestamps (03:14:07, 03:14:16,
03:19:52, 09:00:00) rather than 01/02/03, because an incident timeline is
the true structure of the content — the numbering encodes real information.
Dark theme was authored as a full token set, not an inversion.
Nothing was assumed to work. Each item below was measured.
Contrast, computed before building:
LIGHT all text pairs >= 4.5:1
DARK all text pairs >= 4.5:1
--on-trace on --trace light 7.50:1 dark 6.15:1
focus ring on paper light 6.25:1 dark 6.15:1
ink3 was darkened from #66717F to #5E6875 because it measured 4.45:1 — just
under threshold.
Rendered checks (local HTTP server, viewport emulation at 1280 and 375):
- Canvas trace drawing live with visible excursions — confirmed
- Dark palette flipping correctly — confirmed
document.scrollWidth === clientWidthat 375px — no horizontal overflowNewsreaderandArchivoactually loading, not silently falling back — confirmed- All four timeline entries rendering with their 120px gutter — confirmed
Two false alarms worth recording. Mojibake (·, â€") and a collapsed list
on mobile both appeared during local testing. Neither was a CSS defect: the local
server lacked the charset and viewport meta tags that the publishing wrapper
supplies. innerWidth reported 980 instead of 375, which identified it. The
lesson is to verify the diagnosis before fixing — the real page was correct and
the test rig was not.
One genuine fix from looking: the hero originally consumed the entire fold, pushing the Canvas trace — the whole point of the page — below it. Type scale and vertical rhythm were reduced until the recorder was visible on load.
Not verified: the published artifact could not be opened in an unauthenticated browser. Final visual verification was performed on a local copy wrapped to match the publishing skeleton.
Improving a dashboard that already exists is a different job and should not use the greenfield flow above. Recommended order:
- Audit before generating. Run a WCAG contrast audit on the current
globals.css. This converts "it doesn't look good" into a list of measured defects. - Generate a target with the dials.
--density 8 --variance 3 --motion 2. - Take the tokens, discard the page structure.
--design-systemalways emits a marketing narrative, even for an internal console. - Use
--persist. The--space-*spacing scale appears only in the persistedMASTER.md— not in stdout, despite what SKILL.md claims. Verified across all three output formats. - Migrate tokens, not screens. shadcn components read the CSS variables, so one token change propagates everywhere. Screen-by-screen redesigns strand you with two visual languages live simultaneously.
- Query per component while rebuilding, then re-run the audit in CI.
For a monitoring product specifically, --domain chart is the most valuable part
of the catalogue: rows carry data-volume thresholds, pause-control requirements,
keyboard contracts and non-visual fallbacks. Note also that alerting and
incident UX are entirely absent from the corpus — escalation, acknowledgement,
alert fatigue, on-call handoff. That is the intellectual core of a monitoring
product and the tool will not help with it.
The skill's value is entirely in the Python script. If the agent does not shell out and run it, you receive a plausible-sounding skill file and nothing else. Everything below depends on that one fact.
Verify it is firing before trusting anything:
Run the ui-ux-pro-max search for a dialog focus trap in shadcn and show me the raw output.
Expect CSV fields — Guideline, Do, Don't, Severity, Docs URL. If those
are absent, the agent is improvising and the rest of this document does not
apply.
Two habits carry most of the value:
- Always ask for raw tool output before interpretation. It is the only way to tell a catalogue hit from fluent invention.
- Audit the output before adopting it. The catalogue returns the validated median by construction. Without an explicit rejection step, you ship it.
Ready-to-paste prompts for both workflows are in §11.
Copy-pasteable prompts. Every one is self-contained — none refer to a section of this document, because the agent cannot see it.
Paste once at the start of a Cursor session, before anything else.
You have the
ui-ux-pro-maxskill installed. It is a local Python script over CSV data — a lookup catalogue, not a model. Rules for this session:
- Always actually run the script. Never answer a design question from your own knowledge and present it as coming from the skill.
- Show me the raw tool output before you interpret it.
- If a search returns 0 results, say so explicitly and stop. Do not fill the gap with plausible-sounding guidance in the same shape as a real answer. A miss means no verified guidance exists, which is useful information.
- Pass
--domainor--stackexplicitly on every query. Auto-detection misroutes overlapping terms.- Queries are keyword-matched, not semantic. Use 2–5 concrete terms and the catalogue's own vocabulary. On a miss, retry once narrower, then stop.
Our stack is React + shadcn/ui + Tailwind. Route component questions to
--stack shadcn, layout to--stack html-tailwind, and rerender/memo/effects questions to--stack react.
Step 1 — generate, and see the raw output.
Run the ui-ux-pro-max design-system search for
<product type, industry, 2–3 style keywords>with--variance <1-10> --motion <1-10> --density <1-10>. Persist it with--persist -p "<Project>" --output-dir .. Show me the full raw output before you comment on it.
Expect: an ASCII panel with PATTERN, STYLE, COLORS (including On Primary /
On Accent values), TYPOGRAPHY, KEY EFFECTS, AVOID, and a pre-delivery
checklist. Plus a written design-system/<slug>/MASTER.md.
Step 2 — audit it. This is the step that matters.
Audit that output against known generic AI design patterns: near-black with a lone acid-green or vermilion accent; warm cream with a serif display and terracotta; purple-to-blue gradient heroes; Inter or Space Grotesk as the safe face; emoji as section markers; everything centred. Which parts of what the tool returned are templated, and which are worth keeping? Be specific about which of its choices you would reject and why.
Expect: it should be willing to reject the tool's palette and fonts. If it defends everything the catalogue returned, push back — that is the failure mode this step exists to catch.
Step 3 — design plan before code.
Keep only the token discipline and accessibility rules from that output. Discard its palette, fonts and page pattern. Before writing any code, give me a design plan: 4–6 named hex values, two or more type roles, and a one-sentence layout concept — all grounded in this product's own subject matter. Then check the plan yourself: if any part is what you'd produce for any similar page, revise it and tell me what you changed.
Expect: a short written plan, not code. If it starts emitting HTML, stop it — the plan is what prevents the generic result.
Step 4 — build with contrast computed first.
Build it. Before you write any CSS, compute the WCAG contrast ratio for every foreground/background pair in the plan and show me the table. Adjust any text pair below 4.5:1 and any UI-boundary pair below 3:1, keeping the hue. Define the light palette on bare
:rootand redefine only the tokens for dark — never declare a colour solely inside a media query. Every accent needs a pairedon-*foreground; do not hardcode white on a themed background.
Step 5 — verify by looking.
Serve it and screenshot at 1280 and 375. Confirm: no horizontal overflow (
document.documentElement.scrollWidth === clientWidth), the custom fonts are actually loading rather than falling back to a system face, and the dark theme renders as a complete set rather than one theme's text on the other's ground.
Use this instead of 11.2 when the UI already exists. The order matters: audit before you generate, or you will argue about taste instead of defects.
Step 1 — measure what is actually wrong.
Run
tools/contrast-audit.pyagainst ourglobals.cssand show me the full output for both light and dark. For each failure, propose a replacement hex that keeps the hue and clears the threshold, and show the new ratio. Do not change anything yet.
Expect: a pass/fail table per theme. Failures usually cluster in one or two muted tokens rather than being scattered.
Step 2 — generate a target system for an ops console.
Run the ui-ux-pro-max design-system search for "infrastructure monitoring dashboard ops console" with
--density 8 --variance 3 --motion 2 --persist -p "Ops" --output-dir .. Show me the raw output, then open the generatedMASTER.mdand show me its Spacing Variables section specifically.
Expect: the Real-Time / Operations Landing pattern, a dark technical palette,
and a --space-* table of roughly 2/4/8/12/16/24/32px. The spacing table appears
only in MASTER.md, never in stdout — if the agent says there is no spacing
scale, it did not open the file.
Step 3 — separate the tokens from the sales pitch.
That output includes a marketing page structure — a hero, a trial CTA, a conversion narrative. We are building an internal console, so discard all of that. Keep only the colour tokens, typography, spacing scale and anti-patterns. List exactly what you are keeping and what you are throwing away.
Step 4 — plan the token migration.
Diff our current CSS variables against MASTER.md. Produce a migration table: current value, proposed value, and every component affected. Flag any token we have that MASTER.md lacks, and any
on-*foreground pair we are missing entirely. Do not edit files yet.
Expect: missing on-* pairs are the common finding. A hardcoded #fff on a
themed accent is the classic dark-mode contrast bug.
Step 5 — migrate tokens, not screens.
Apply the migration by changing the CSS variables only. Do not restyle components individually — shadcn reads the variables, so the change should propagate. Then re-run the contrast audit and show me that it passes in both themes.
Step 6 — per-component work, then lock it in.
For each of these, run a
--stack shadcnsearch and show the raw rows before you change code: chart accessibility, collapsible sidebar, data table, skeleton loading states. Then add the contrast audit to CI so it fails the build on a regression.
Run
--domain chartfor "real-time monitoring time series" and show me the full rows, including the When-NOT-to-use, data volume threshold, accessibility fallback and keyboard contract fields for each result.
Expect: the richest rows in the whole catalogue. Adopt the "do not rely on colour alone" rule verbatim — encode severity in mark shape as well as hue.
Do not bother asking it about alerting, escalation, acknowledgement, alert fatigue or on-call handoff. Measured: those return zero results. The corpus does not cover them, and a well-behaved agent will tell you so.
| Signal | Meaning |
|---|---|
CSV field names in the output (Guideline, Do, Don't, Severity, Docs URL) |
Real catalogue hit |
| Fluent prose with no field names | The agent is improvising |
| "did not hit the database" | A genuine miss — correct behaviour, trust it |
| Advice on alerting or incident UX | Necessarily invented; nothing in the corpus covers it |
If you see the second row, stop and re-run with the context preamble from 11.1.
# install — Cursor
npm install -g ui-ux-pro-max-cli
uipro init --ai cursor # .cursor/skills/
uipro init --ai cursor --global # ~/.cursor/skills/
# confirm the skill is really firing (expect CSV fields, not prose)
uipro search "dialog focus trap" --stack shadcn
# generate a design system, persisted
uipro search "<product> <industry> <keywords>" --design-system \
--variance <1-10> --motion <1-10> --density <1-10> \
--persist -p "Project" --output-dir .
# targeted domains
uipro search "real-time monitoring time series" --domain chart
uipro search "dashboard analytics dense data" --domain color
uipro search "editorial authoritative" --domain typography
uipro search "error summary validation" --domain ux
# stack guidance
uipro search "dialog focus trap" --stack shadcn
uipro search "chart accessible" --stack shadcn
uipro search "responsive breakpoint" --stack html-tailwindAvailable domains: style, color, chart, landing, product, ux,
typography, google-fonts, icons, gsap, react, web.
Adopt it — as a checker. The colour data is genuinely validated (1,344/1,344 text pairs pass AA), the chart domain carries real operational engineering, and the tool refuses to fabricate on a miss. For React + shadcn + Tailwind it is at its strongest.
Do not expect it to design. It converges on the validated median by construction. Every distinctive decision in the landing page — the chart-recorder concept, the oxblood palette, the serif body, the timestamp spine — came from outside the tool. What the tool contributed was the discipline that kept those decisions accessible and consistent.
The most transferable practice from this session is not any command. It is turning the tool's own standard back on your existing work — which is how six real contrast defects were found in an unrelated production codebase in about a minute, including a primary button at 2.42:1 in dark mode.
Re-check the measurements after any uipro update. The catalogue is actively
maintained; every stack row currently carries a verification date of August 2026.