improve-ui
Point at a running UI — a screen, or a whole task flow like creating something, signing up, or checking out — and get a published preview of what it actually looks like plus ranked, concrete proposals
SKILL.mdskills/improve-ui/SKILL.md
GitHubImprove UI
Look at a real running UI, find what is holding it back, and publish screenshots next to concrete proposals the user can react to.
This skill proposes. It does not change application code — implementation runs afterwards through the preview skill's approved-preview path.
Hard requirements
agent-browseris the only way this skill sees the UI. Every finding comes from a page that was actually opened, screenshotted, and interacted with. Reading components and inferring how they render is not a substitute and never produces a finding on its own. If the target cannot be reached in a browser, stop and say so instead of reviewing from source.skill://previewpublishes the result. No markdown report, no wall of chat text — the deliverable is one link.skill://uxsupplies the judgement. Its Visual consistency check and Intentional visual restraint check are the fixed part of the review; the proposals are the rest.
1. Resolve the target
The invocation should name the place to improve. It comes in two shapes, and which one it is changes what you capture and what you judge:
- A surface — a URL, route, screen, or page. "Improve the settings page."
- A flow — a task the user is trying to finish across several steps. "Improve creating a project", onboarding, sign-up, checkout, invite a teammate, publish. A flow is named by its goal, not its routes; your job is to find the entry point and walk the whole thing to done.
If the target names a task or a verb, treat it as a flow even when it happens to live on one screen — a one-screen create form still has a sequence, defaults, validation timing, and a "what now" moment after submit.
Everything else you work out yourself.
Before asking the user anything, find out from the repo:
- how the app starts (
package.jsonscripts,Procfile,docker-compose, a projectrun/dev skill) — and start it if it is not already running; - what routes and screens exist, so you can name candidates concretely;
- whether the flow needs auth, seeded data, or a feature flag.
Then ask one question only if a real ambiguity survives — typically "which of these screens" or "what credentials get me past login". Do not ask what the codebase answers. If the invocation named no place at all, list the routes you found and ask which one, with a recommendation.
Fix these before opening the browser: reachable URL(s), scope (which screens/states are in, or where the flow starts and what counts as done), viewports (default: 1440×900 desktop and 390×844 mobile), and whether the app has a dark theme worth checking.
For a flow, also decide the goal you will actually carry out — a specific, realistic task with real-looking data ("create a project called Q3 Migration and invite one teammate"), not a click-through. You have to finish it to know where it hurts.
2. Load the rules
agent-browser skills get core # required before any browser command
Read skill://ux for both checklists and skill://preview for publishing.
Then find the project's design system the way the preview skill's Inherit the
project's design system section describes — UX.md, docs/ux/*, token
stylesheets, Tailwind/theme config, component library. Proposals must be made
in the product's own tokens, components and vocabulary; that is the difference
between a design review and a generic critique.
3. Walk the UI
Drive the real app. Per screen in scope:
agent-browser set viewport 1440 900
agent-browser open <url>
agent-browser snapshot -i # what is actually interactive
agent-browser screenshot ~/.preview/<slug>/shots/<screen>-desktop.png
agent-browser screenshot --full ~/.preview/<slug>/shots/<screen>-desktop-full.png
agent-browser set viewport 390 844
agent-browser screenshot ~/.preview/<slug>/shots/<screen>-mobile.png
Save every screenshot straight into the preview folder's shots/ — they are
the evidence and they go in the page.
Then test it, don't just photograph it:
- States: hover and focus the primary controls (
hover @eN,press Taband screenshot the focus ring), submit a form empty and with invalid input, reach the empty state with no data, and force loading and error withnetwork route "**/api/**" --abortor--body '{...}'. - Overflow: put a long name, a long translation, or a long URL into the
cells and labels via
eval --stdin, and re-screenshot at the narrow viewport. Truncation bugs live here. - Keyboard path: tab through the screen in order; note traps, invisible focus, and controls you cannot reach.
- Dark mode:
agent-browser set media darkwhen the app themes. - Health:
agent-browser console,agent-browser errors, andagent-browser vitals— layout shift and a slow LCP are UI problems.
Walking a flow
For a flow target, do the task for real, start to finish, and screenshot
every step in order — including the moments between screens: the entry
point that starts it, each step, the submit, and whatever the app shows you
after it succeeds. Number the shots by step (shots/02-details-desktop.png) so
the sequence survives into the preview.
While walking, keep a running log of things a per-screen review cannot see:
- Step count and what each step asks for — and which fields could have been defaulted, inferred, deferred, or dropped.
- Where you had to leave to fetch something the flow needed (an ID, a name, a file) and whether the flow helped you get back.
- Back, cancel, and close at every step: what is lost, what is kept, and where you land. Try the browser Back button too, not just the app's.
- Interruption and resume — reload mid-flow and re-open the entry point. Is the half-finished work still there, and does the app admit it exists?
- Failure at the worst moment — force the final submit to fail
(
network route "**/api/**" --abort) and see whether the input survives. - The landing — after success, does it tell you what happened, where the thing went, and what to do next, or drop you on a list?
Then re-walk the unhappy paths: the empty/first-run version of the flow (no existing data), and the validation path where you submit each step wrong before getting it right.
Record what you could not reach (a state behind data you don't have, a step requiring a second user or a real payment) and say so in the preview. Never illustrate a state you did not observe.
Evidence rule: every finding names the screenshot, the viewport, and the action that produced it. A claim with no shot behind it does not go in.
4. Judge, then propose
Run the UX skill's Visual consistency check and Intentional visual
restraint check against the observed UI — the rendered pixels, not the plan
or the code — using its Pass / Needs decision / Issue / Not applicable
statuses.
The checklists catch defects. They are the floor, not the output. Also ask, per screen: what is this screen for, what decision or action is the user here to make, and what in the current design gets in the way? The best proposal is usually about hierarchy, sequence, or what to cut — not a control that is three pixels off.
For a flow, judge the shape of the task before any single screen, because a step that shouldn't exist cannot be fixed by aligning it:
- Does every step earn its place? Merge, reorder, default, infer, or defer anything the user cannot answer confidently at that moment.
- Is the order the user's order? Ask for what they came with first; push configuration after the thing exists.
- Is the commitment honest? The user should know how long this is, what is required versus optional, and what happens on submit — before they start.
- Is it survivable? Cancel, back, reload, and a failed submit should never cost typed work without saying so first.
- Does it end? Success should name the result, show where it lives, and offer the obvious next action.
Say plainly when the right fix is fewer steps rather than better ones.
Rank proposals by leverage, and lead with the top three. Each one states:
- What's wrong — with its evidence.
- Why it matters — the user cost, not the rule number.
- The change — specific enough to build, in the project's existing tokens and components.
- Cost and blast radius — one screen or the whole design system.
- What it doesn't fix — so the user can weigh it honestly.
The restraint check applies to your own proposals too: no gradients, shadows, hero type, bento grids, or cardification arriving as "polish". If a proposal needs a genuinely new pattern, say so and justify it.
5. Publish the preview
Follow skill://preview. Slug: <project>-ui-<area> (e.g.
annury-ui-settings). Shape the page for reacting, not reading:
- TL;DR — the three biggest wins, before any detail.
- One
<section>per screen or per step, with a stable id you'll recognise in annotation feedback: the screenshot as a<figure>(linked to the full-size image,loading="lazy",data-pa-zoomfor dense shots), what's wrong under it, then the proposal. Use.shot-gridfor desktop/mobile pairs and tabs for before/after or state comparisons. - For a flow, open with the step map before the per-step sections: a mermaid flowchart of the walk as it exists today — every step, branch, cancel, and failure path you actually hit — and, when you propose a different shape, the proposed map beside it in tabs. Sections then run in step order, numbered as walked, so the page reads as the task. Keep the flow-level proposals (what merges, what goes) above the per-step ones; a reader who accepts a step's removal should not have to read its polish notes first.
- Build the "after" for the top proposals as a static variant HTML file in the slug folder, styled with the project's real tokens, and put it next to the screenshot. A rebuilt screen beats a paragraph describing one. For several directions, use the preview skill's variant-gallery layout.
- The two checklists in a collapsed
<details>accordion — full results, out of the way of the proposals. data-questiononly where two readings lead to materially different work. Roughly three is plenty; decide the rest yourself and state the assumption.- Untested surface listed explicitly in its own section.
narration.md+~/.preview/_skill/bin/narrate <slug>— this is a page that asks for decisions, so it gets audio.- Implementation launchers only when the set of proposals is large and ready to build; the plan ref is the preview URL.
Before handing over the link, run the preview skill's self-check probe and open
your own page in agent-browser to look at it — light and dark.
6. Hand back
Reply with the link, the top three proposals in one line each, and what you could not test. Nothing else.
Boundaries
- No application code changes here. When the user approves and asks for implementation, follow the preview skill's From approved preview to implementation: write the markdown UX handoff plan first, keep this session as orchestrator, delegate slices with the UX rule pack.
- No tickets unless the user asks for them.
- No re-grilling. This skill observes and proposes; it does not walk the UX skill's Grill-mode question tree.