beautify
Beautify
Make web apps look intentionally designed rather than AI-generated. This skill covers the visual principles that separate premium-feeling apps (Stripe, Linear, Vercel) from generic template output. Apply these principles when building new UI or when the user says something "looks off" but can't articulate why.
Reference AI-SLOP-FIXES.md for specific antipattern remediation. Reference REFERENCE-TEARDOWNS.md for concrete examples from production apps.
Core Principles
- Restraint is the primary aesthetic. Premium apps use fewer colors, fewer font weights, fewer borders, fewer shadows. When in doubt, remove rather than add.
- Every visual difference must communicate a difference in meaning. If two elements look different, they should BE different. If they're the same type of thing, they must look identical.
- Hierarchy is not optional. Every screen has exactly one primary focal point, 2-3 secondary elements, and everything else recedes. If everything is emphasized, nothing is.
- Whitespace is a design element, not empty space. It creates grouping, hierarchy, and breathing room. Increasing whitespace almost always improves perceived quality.
- Color is information, not decoration. Each color in the palette should have a job. If a color doesn't communicate status, action, or brand, remove it.
- Consistency compounds. One slightly-off spacing value is invisible. Twenty slightly-off values make an app feel broken. Nail the system, not individual screens.
- The eye follows contrast. The highest-contrast element on screen gets attention first. Use this deliberately — never accidentally.
Visual Hierarchy
This is the single most impactful skill. A clear hierarchy makes any design feel professional; a muddled one makes even beautiful components feel amateurish.
Tools for creating hierarchy (in order of impact):
Size difference. The primary element should be dramatically larger than secondary elements. Not 10% larger — 50-100% larger. A page heading at text-3xl with body at text-sm creates immediate hierarchy. A heading at text-xl with body at text-lg creates mush.
Weight contrast. Pair font-bold (700) headings with font-normal (400) body text. Never use font-medium (500) for both headings and body — the difference is invisible. Use at most 3 font weights per page: one for headings, one for body, one for de-emphasized text.
Color contrast. Primary content in text-gray-900, secondary in text-gray-500, tertiary in text-gray-400. Three levels is usually enough. Don't use text-gray-700 and text-gray-600 on the same page — the difference is imperceptible.
Spatial hierarchy. The most important element gets the most surrounding whitespace. A CTA button with py-3 px-8 surrounded by mt-8 commands more attention than one with py-2 px-4 and mt-4.
Common hierarchy failures:
- Flat hierarchy: Every text element is
text-base font-medium text-gray-700. Fix: Pick ONE weight/size for body, make headings dramatically different. - Inverted hierarchy: Navigation or header competes with page content. Fix: Nav should be quieter than content — use
text-sm font-normal text-gray-500for nav items. - Competing CTAs: Multiple buttons with equal visual weight. Fix: One
bg-primary text-whitebutton per section. Everything else istext-gray-600 hover:text-gray-900or a ghost/outline variant.
Whitespace
The core rule: space between groups > space within groups
If items inside a card are spaced with gap-3 (12px), the gap between cards should be gap-6 (24px) or more. If sections use gap-6 internally, section gaps should be py-16 or py-20. This ratio (2-3x) is the single most important spacing principle.
Where to add whitespace:
- Page margins.
px-6minimum on mobile,px-8topx-12on desktop. Cramped edges make everything feel cheap. - Above page headings.
pt-8topt-12before the first heading. Content that starts immediately below the nav feels rushed. - Between sections.
py-12topy-20between major sections. This is almost always too small in AI-generated output. - Around CTAs. Primary buttons need breathing room.
mt-6tomt-8above a CTA gives it importance. - Inside cards.
p-6is the minimum for cards with content.p-4works for compact list items but feels cramped for standalone cards.
Where density is correct:
- Data tables. Tight rows (
py-2topy-3) with compact cells are fine — density is the point. - Navigation items.
py-2 px-3keeps nav compact and functional. - Form fields.
gap-4togap-5between form fields is appropriate — too much space makes forms feel disconnected. - Inline elements. Icon-to-text gap of
gap-1.5togap-2. Badge padding ofpx-2 py-0.5.
Color Application
The 60-30-10 rule
- 60% neutral. Backgrounds, cards, body text. White/gray/off-white. This is the canvas.
- 30% secondary. Borders, secondary text, dividers, subtle backgrounds. Gray-200 to gray-500 range.
- 10% accent. Primary buttons, active states, links, key indicators. Your brand color.
Most AI-generated apps flip this ratio — too much accent color, not enough neutral space. If more than 10% of the visible pixels are your brand color, pull back.
Saturation management
- Interactive elements (buttons, links, active tabs) use full-saturation brand color.
- Backgrounds and containers use desaturated, lightened variants:
bg-blue-50notbg-blue-500. - Status colors (success, error, warning) use medium saturation for backgrounds (
bg-green-50,bg-red-50) with full saturation for text and icons (text-green-700,text-red-700). - Never use full-saturation color as a large background. A
bg-blue-600hero section screams template. Usebg-whiteorbg-gray-50with a blue accent element instead.
When NOT to use color
- Section backgrounds — use whitespace or subtle borders to separate sections, not colored backgrounds.
- Every card having a colored accent — pick one or two cards to highlight, leave the rest neutral.
- Decorative color blocks with no information purpose.
Typography in Practice
Weight pairing
Use exactly two weights for most UI: font-semibold (600) for headings and labels, font-normal (400) for body and descriptions. Add font-medium (500) only if you genuinely need a third level (e.g., subheadings within a section). Never use font-light (300) — it's unreadable at small sizes on most screens.
Size relationships
Maintain a clear step ratio between sizes. A practical scale:
| Role | Tailwind | Size |
|---|---|---|
| Page title | text-2xl or text-3xl |
24-30px |
| Section heading | text-xl |
20px |
| Card title | text-lg or text-base font-semibold |
16-18px |
| Body | text-sm or text-base |
14-16px |
| Secondary/meta | text-xs or text-sm |
12-14px |
The key: adjacent levels in the hierarchy should be at least 2 Tailwind size steps apart. text-base heading with text-sm body works. text-lg heading with text-base body is too close.
Line length
Body text should never exceed max-w-prose (~65ch). Text that stretches across a full-width container is the fastest way to look unprofessional. For headings, max-w-2xl keeps them from stretching too wide on large screens.
Letter-spacing
- Large headings (
text-3xland up): addtracking-tight(-0.025em). Large text has too much natural spacing. - Body text: leave default (no tracking class).
- All-caps labels or overlines: add
tracking-wideortracking-wider. Uppercase text without extra tracking looks cramped.
Composition
Alignment grids
Pick ONE alignment edge for content and stick to it across pages. Left-align is correct for 90% of SaaS UIs. Center-align only for: hero sections, empty states, and confirmation dialogs. Never center body text, form fields, or data.
Visual rhythm
Repeating elements (cards, list items, table rows) must be identical in structure. Same padding, same text sizes, same spacing between elements within each item. Variation in repeating elements creates visual noise — the eye constantly readjusts instead of scanning smoothly.
Page-level balance
- F-pattern for content pages: Primary content left, secondary content right. The eye naturally scans left-to-right, top-to-bottom.
- Single-column for focused tasks: Forms, checkout flows, onboarding steps. Max-width
max-w-lgtomax-w-xl, centered. - Sidebar + content for dashboards: Fixed-width sidebar (
w-64), fluid content area. Content area should have its own internal max-width for readability.
Asymmetry that works
Not everything needs to be perfectly centered or symmetrical. A page with a large content area and a narrow sidebar is asymmetric but balanced because the content has visual weight. A card grid with 3 columns where the first card is double-width creates intentional asymmetry that draws the eye.
Consistency
Cross-page coherence
Every page in the app should share:
- Identical header/nav height and style
- Same page padding and max-width
- Same heading hierarchy (h1 = page title at same size everywhere)
- Same card style (if pages use cards)
- Same button variants (primary/secondary/ghost look identical on every page)
Pattern reuse
When building a new page, explicitly reuse patterns from existing pages. Don't invent a new card style when one exists. Don't create a new button variant when primary/secondary/ghost covers the need. Every unique visual pattern adds cognitive load.
The "same but different" problem
Lists of items (pricing plans, feature comparisons, team members) should use identical visual structure with only content changing. When one pricing card has an icon and another doesn't, or one has a colored background and others don't, it creates unintentional hierarchy. If you need to highlight one option, do it with a single differentiator: a border color, a "Popular" badge, or a slight size increase — not three differences at once.
Auditing
For structured audit checklists (60-second scan and comprehensive), use the design-review skill. The principles in this skill inform what to look for; design-review provides the systematic checklist.