Alice Monroe
Product designer. Coffee powered. Ship small, ship often. Based in Lisbon.
polish_ audits real UI code for usability, design craft, and accessibility with a self‑hosted Node script, your own API key, no bots in your repo, and no quotas.
The same card, reviewed by the same rubric. The before version is a realistic AI-generated component:
inline hex colors, a clickable <div>, a delete action with no confirmation.
Fix each finding and the score follows. The verdicts below are live model runs on Groq with the default
model, llama-3.3-70b-versatile. Scores shift with the model, so run polish on your own code.
Then polish --verify findings.json re-checks each finding against the updated code,
at a fraction of the cost of a full re-review. Live verdicts vary between models and runs,
so treat any single score as a signal, not a grade.
Paste a GitHub URL. Get a preview score with three findings.
Two real components, each reviewed by the same rubric. Toggle Before and After to see what polish changes, then flip to Code to inspect the source behind each version.
Product designer. Coffee powered. Ship small, ship often. Based in Lisbon.
Gradient background, hardcoded hex, divs as buttons, no focus styles, cramped 6px gaps.
Live review: 62/100, 3 serious, 2 moderate
Product designer. Coffee powered. Ship small, ship often. Based in Lisbon.
Tokens, real buttons, focus-visible rings, 4px spacing scale, accessible names.
Live review: 78/100, 1 serious, 3 moderate
Divs as labels, no <form>, div-as-submit, no validation, no loading state, hardcoded hex.
Live review: 43/100, 1 critical, 2 serious, 3 moderate
Proper <label> associations, <form> semantics, focus-visible, helper text, loading state, token-based styles.
Live review: 66/100, 0 critical, 1 serious, 6 moderate
The whole pipeline in one terminal: config, prompts, the model call, scoring, and findings with fixes. Recorded from live runs against both demo components with the default model on Groq.
Recorded live run, Groq with llama-3.3-70b-versatile. The same command runs live any time:
polish demo/ProfileCard.before.jsx.
Three layers cover what senior designers check in code. Not screenshots, not vibes. Every rule is written so a model can verify it against source, and the whole thing is plain data, so you can replace it with your own design philosophy.
How the system communicates and recovers: feedback, control, consistency, error prevention, and efficiency. Ten heuristics, H1 to H10.
Design-system discipline and production polish: tokens, type, spacing, motion, components, and the words on the buttons. Seven categories, C1 to C7.
Checkable requirements: contrast, keyboard support, semantics, forms, touch targets, and reduced motion. One pass, A11Y.
Start at 100. Each finding deducts by severity: 22 for critical, 9 for serious, and 3 for moderate. Polish has no severity ceiling. Try the model below.
| Severity | Deduction | Example |
|---|---|---|
| critical | 22 | Unreachable by keyboard |
| serious | 9 | Hardcoded hex, no confirmation |
| moderate | 3 | Magic radius, transition: all |
critical deducts 22
serious deducts 9
moderate deducts 3
The score never drops below 0.
Works with Groq, OpenAI, Anthropic, Gemini, OpenRouter, or any OpenAI-compatible endpoint. Use one provider per run or set a fallback chain. Polish reviews app UI, including the words users see. It is not a general code quality or backend linter.
# bash
git clone https://github.com/tomiabe/polish.git
cd polish
npm link
# export one key export GROQ_API_KEY=... # or OPENAI / ANTHROPIC / GEMINI / OPENROUTER
polish # audit files matched by config globs polish src/components src/pages/*.tsx # or specific files polish --verify findings.json # re-check that fixes landed polish --json # machine-readable receipt, for CI or agents polish init-agent # write the agent review loop polish --dry-run # preview cost, no API call
Exits with code 1 when critical findings exist. Wire it into pre-commit or CI.
// .polish.json, everything optional { "provider": "anthropic", "providers": ["gemini", "groq"], "rubric": ["usability", "craft", "accessibility"], "include": ["src/**/*.{tsx,css}"], "maxFiles": 20 }
polish audits this page too. Running polish --dry-run docs/index.html estimates about 29,000 tokens, under a cent on most models.
Polish also runs as an MCP server over stdio. Coding agents call the same engine as the CLI, with identical prompts, scoring, findings, and machine-readable receipts.
Review UI files by content. Returns a score, counts, assessment, receipt, and findings with severity, category, file:line, and a fix.
Re-check previous findings against updated content. Returns a new score and reports FIXED or STILL PRESENT per finding.
Usage status: always unlimited. Self-hosted means no quota and no subscription, just your own key.
Give your coding agent a repeatable UI review loop. Run Polish, read the receipt, apply the highest-impact fixes, then verify the result.
Writes AGENTS.md into your repo. It teaches agents when to review UI changes, how to read a receipt with polishApplied: true, and how to verify fixes afterward.
Every run emits a receipt with a run ID, score, files reviewed, and category breakdown. --json outputs the full receipt for CI pipelines and agent loops.
After fixes, polish --verify re-checks only the previous findings and returns a fresh score. The agent reads the result and stops when all findings are resolved.