Based on Anthropic's Frontend Aesthetics research. Adapted for OpenClaw with practical tooling additions.
Based on Anthropic's Frontend Aesthetics research. Adapted for OpenClaw with practical tooling additions.
You tend toward generic, "on distribution" output. In frontend design, this creates "AI slop": white backgrounds, purple gradients, Inter font, predictable card layouts. Fight this instinct. Every frontend should feel like a human designer made deliberate, bold choices.
Before coding, commit to a clear aesthetic direction:
Write down your aesthetic direction before coding. This prevents drift back to defaults.
NEVER use: Inter, Roboto, Arial, system-ui, system fonts, or any default sans-serif.
DO use: Distinctive, characterful fonts from Google Fonts. Pair a display font with a body font:
| Display (headings) | Body (text) | Vibe |
|---|---|---|
| Syne | DM Sans | Modern tech |
| Playfair Display | Source Serif Pro | Editorial luxury |
| Archivo Black | Work Sans | Bold industrial |
| Fraunces | Outfit | Organic warmth |
| Instrument Serif | Instrument Sans | Refined minimal |
| Space Mono | Karla | Terminal/hacker |
| Unbounded | Figtree | Playful modern |
| Cormorant Garamond | Lato | Classic elegance |
| Bebas Neue | Barlow | Poster/display |
| JetBrains Mono | IBM Plex Sans | Developer tools |
Vary your choices. If you used Syne last time, pick something completely different. NEVER converge on the same font across projects.
--primary, --accent, etc.)NEVER use: Purple gradient on white, blue-to-purple gradients, generic tech-blue (#4F46E5 and friends).
Pick ONE inspiration and let it infuse the whole design. Don't mix three aesthetics — commit.
/* Warm industrial */
--bg: #1C1917; --surface: #292524; --primary: #F97316; --accent: #FCD34D; --text: #F5F5F4;
/* Cool editorial */
--bg: #FAFAF9; --surface: #FFFFFF; --primary: #0F172A; --accent: #DC2626; --text: #1E293B;
/* Nature/organic */
--bg: #ECFDF5; --surface: #FFFFFF; --primary: #065F46; --accent: #D97706; --text: #1F2937;
/* Neon dark */
--bg: #0A0A0B; --surface: #18181B; --primary: #22D3EE; --accent: #F472B6; --text: #E4E4E7;
/* Vintage paper */
--bg: #FEF3C7; --surface: #FFFBEB; --primary: #92400E; --accent: #B91C1C; --text: #451A03;
Focus on high-impact moments over scattered micro-interactions:
animation-delay — elements fade/slide in sequentiallyanimation-timeline)Implementation:
.visible class toggle/* Staggered reveal pattern */
.reveal { opacity: 0; transform: translateY(20px); transition: all 0.6s ease-out; }
.reveal.visible { opacity: 1; transform: translateY(0); }
.reveal:nth-child(1) { transition-delay: 0s; }
.reveal:nth-child(2) { transition-delay: 0.1s; }
.reveal:nth-child(3) { transition-delay: 0.2s; }
NEVER default to solid white or solid dark. Create depth:
background: radial-gradient(at 20% 50%, color1, transparent), ...)background-image with noise)/* Noise overlay */
.grain::after {
content: ''; position: fixed; inset: 0; z-index: 9999; pointer-events: none;
background-image: url("data:image/svg+xml,..."); /* inline SVG noise */
opacity: 0.03;
}
/* Mesh gradient */
.mesh-bg {
background:
radial-gradient(at 40% 20%, hsla(28, 100%, 74%, 0.3) 0, transparent 50%),
radial-gradient(at 80% 0%, hsla(189, 100%, 56%, 0.2) 0, transparent 50%),
radial-gradient(at 0% 50%, hsla(355, 85%, 63%, 0.15) 0, transparent 50%),
var(--bg);
}
Break the grid. Not everything needs to be a card in a 3-column layout.
These patterns consistently produce better results:
transform: perspective(1000px) rotateY(-5deg) that flattens on hover.fade-in with incrementing animation-delay (0.1s, 0.2s, 0.3s...)background: linear-gradient(...); -webkit-background-clip: text; -webkit-text-fill-color: transparent;::before pseudo-element that expands from center on hoverscaleX(0→1) on hoverradial-gradient circles with slow animation: float 20s ease-in-out infinitebackdrop-filter: blur(10px) with scroll-triggered class toggleAfter generating frontend code, preview it:
# Quick preview — write HTML to file and screenshot
echo '<html>...</html>' > /tmp/preview.html
# Use the website-screenshot skill for headless capture:
# node ~/openclaw/skills/website-screenshot/scripts/screenshot.cjs file:///tmp/preview.html
# Or serve locally for React/Vue apps:
npx vite preview --host 0.0.0.0 --port 5173
Elegance = executing the vision well. A minimal design with sloppy spacing is worse than a maximalist design that's consistent.
You are capable of extraordinary creative work. Don't default to safe. Don't hold back. Show what happens when you fully commit to a distinctive vision.