seedflip
FlipDemoArchive
Mixtapes
Pricing
Sign in

Bolt.new Design Tips: Making AI-Generated Sites Look Custom

You shipped a working app in a day. The backend is impressive. The single remaining issue is that the UI looks like every other Bolt project on the internet. That's fixable in fifteen minutes.

Find your design system at SeedFlip →

The bolt.new design problem is the last problem. You shipped a working app in a day. Auth is running. The database is connected. Deployment is live. The backend is legitimately impressive and you built it faster than most teams build a Jira ticket. The single remaining issue — the thing that makes you hesitate before sending the link — is that the UI looks like every other Bolt project on the internet. The same slate-800 sidebar. The same indigo-600 primary button. The same rounded-lg cards with shadow-sm. That's not a failure. That's an unfilled aesthetic layer, and it's fixable in fifteen minutes without opening Figma.

What's Actually Causing the Homogeneity

Bolt generates Tailwind. Tailwind is deliberately, philosophically unopinionated about aesthetics — it's a utility system, not a design system. bg-slate-800 is a color. text-indigo-600 is a color. They don't belong to any particular aesthetic. They just happen to be what AI models reach for when generating Tailwind UI without constraints, because they appeared most frequently across the training data.

This is the core of the bolt.new design sameness problem. When you prompt Bolt without a visual specification — “build me a dashboard,” “add a settings panel,” “create an onboarding flow” — it resolves the aesthetic by averaging. The average of AI-generated Tailwind interfaces is slate, indigo, gray-50, rounded-lg, shadow-sm. It works. It's inoffensive. It is also exactly what ten thousand other Bolt apps look like.

The solution isn't longer adjectives in your prompt. “Make it look premium and modern and clean” does not produce different output from “make it look nice.” The AI resolves adjectives by averaging, same as before. What produces different output is a mathematical definition of your aesthetic — specific values it must use — inserted into the project before generation begins.

Bolt.new Design Override: The Root-Level Approach

Tailwind's utility classes reference an underlying theme. That theme has defaults, but it also respects CSS custom properties. If you define your tokens at :root before any components exist, Bolt's Tailwind output will pull from your tokens instead of its defaults. You're not rewriting components. You're shifting the floor the entire system stands on.

Here's the mechanism. Create or edit your globals.css and add this block before Bolt generates anything:

@import url('https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;700&family=IBM+Plex+Mono:wght@400&display=swap'); :root { /* Replace the default slate-950 → warm concrete */ --background: #FFFBEB; --foreground: #1A1A1A; /* Replace slate-800 → cream white */ --card: #FFFFFF; --card-foreground: #1A1A1A; /* Replace indigo-600 → signal red */ --primary: #DC2626; --primary-foreground: #FFFFFF; /* Replace gray-100 → warm off-white */ --secondary: #FEF9EE; --secondary-foreground: #1A1A1A; --muted: #F5F0E0; --muted-foreground: #525252; --border: #1A1A1A; --input: #1A1A1A; --ring: #DC2626; /* Typography */ --font-heading: 'Space Grotesk', sans-serif; --font-body: 'IBM Plex Mono', monospace; /* The single variable with the highest visual ROI */ --radius: 0px; }

Then wire the tokens into your Tailwind config:

// tailwind.config.ts export default { theme: { extend: { colors: { background: 'var(--background)', foreground: 'var(--foreground)', card: { DEFAULT: 'var(--card)', foreground: 'var(--card-foreground)', }, primary: { DEFAULT: 'var(--primary)', foreground: 'var(--primary-foreground)', }, muted: { DEFAULT: 'var(--muted)', foreground: 'var(--muted-foreground)', }, border: 'var(--border)', }, fontFamily: { heading: ['var(--font-heading)'], body: ['var(--font-body)'], }, borderRadius: { lg: 'var(--radius)', md: 'calc(var(--radius) + 2px)', sm: 'calc(var(--radius) + 0px)', }, }, }, }

Now when Bolt generates a component and reaches for bg-background, it gets #FFFBEB — warm cream paper — not slate-950. When it uses text-primary, it gets signal red, not indigo-600. When it applies rounded-lg, it gets 0px and creates sharp brutalist edges across every component simultaneously.

Notice --radius: 0px. Border-radius is disproportionately powerful as a design signal. It's the value most reliably responsible for the generic Bolt aesthetic — the default 8px rounded-lg appears on every card, button, input, badge, and modal in every generated project. Changing it to 0px creates a brutalist graphic design system. Changing it to 1.5rem creates a soft, friendly product. Changing it to 6px creates a precise, technical developer tool. One variable. The entire character of the interface shifts.

Telling Bolt What the Rules Are

Tokens define values. They don't define application logic. Without rules, Bolt will use your custom tokens correctly for the first component and then start interpolating freely. Your red primary ends up on table row hover states, badge backgrounds, active nav indicators, and inline link text simultaneously. The system is technically using your tokens. It looks like a design school project.

Paste this at the start of your Bolt session:

This project uses a custom design system defined in globals.css and tailwind.config.ts. All new components must use only the custom token classes (bg-background, text-foreground, bg-primary, bg-card, etc.) — never raw Tailwind color utilities like bg-slate-800 or text-indigo-600. Color rules: bg-primary and text-primary for primary actions only — buttons, active states, key highlights. Never for decoration. Never for hover backgrounds. text-muted-foreground for timestamps, metadata, helper text, secondary labels. Shape: rounded-lg on all cards and containers. rounded-md on buttons and inputs. No values outside this scale. Borders are 2px solid border-color — intentional and visible. Depth: hard 4px offset shadows only — shadow-[4px_4px_0px_#1A1A1A]. No soft blurred shadows. No colored glows. Spacing: dense but structured. 16px inside cards. 8px between elements. 32px between sections.

This takes sixty seconds to write. It establishes the aesthetic contract for the entire session. Bolt is no longer improvising. It's implementing.

Finding the Right System Before You Commit

Here's the real obstacle: defining custom tokens requires knowing what aesthetic you're going for. Most developers building fast don't have a visual direction locked — they have a product locked. “Something that feels like a dev tool” is not a CSS value.

The exploratory work needs to happen before you touch globals.css. You need to see complete aesthetics applied to real UI — not palette swatches, not type specimens — actual interfaces with headers, cards, tables, buttons, and code blocks wearing the system you're considering.

SeedFlip is a design system randomizer with 100+ curated seeds, each one a complete aesthetic applied to a live demo landing page in real-time. Flip through them. The entire interface re-styles on every flip — fonts, colors, radius, shadows, gradients, all of it. You're evaluating complete visual systems in context, not abstract design decisions in isolation.

The Archive shows all 100+ seeds as CSS-rendered thumbnail cards — every thumbnail generated from that seed's actual tokens, not mockups or screenshots. Filter by Dark, Light, Minimal, Bold, Warm, Neon, Elegant. When something clicks, you know it because you're looking at an interface that looks like your product.

The free export — The DNA — gives you the complete CSS variable block, Google Fonts import included, ready to drop directly into globals.css. Here's what a dark precision seed's DNA looks like:

@import url('https://fonts.googleapis.com/css2?family=JetBrains+Mono:wght@400;600&family=Inter:wght@400;500;600&display=swap'); :root { --background: #0D1117; --foreground: #E6EDF3; --card: #161B22; --card-foreground: #E6EDF3; --primary: #58A6FF; --primary-foreground: #0D1117; --muted: #21262D; --muted-foreground: #8B949E; --border: #30363D; --font-heading: 'JetBrains Mono', monospace; --font-body: 'Inter', sans-serif; --radius: 0.375rem; --shadow-sm: 0 1px 3px rgba(0,0,0,0.3); --shadow-md: 0 0 0 1px #30363D, 0 8px 24px rgba(0,0,0,0.4); }

Drop it in. Tell Bolt to use it. The project no longer looks like a Bolt default because it isn't pulling from Tailwind defaults anymore.

Lock the Vibe, Flip the Atmosphere

If you've got a Bolt app that's structurally working but visually undecided, SeedFlip's Lock & Flip mechanic is the right tool before you commit to an export.

Lock & Flip (Pro) lets you freeze individual design categories — Type, Palette, Shape, Atmosphere — and shuffle the rest. Lock the shape system that makes your components feel right-proportioned. Lock the typography if the font pairing is working. Then flip through palettes and atmospheres until the color temperature clicks. You're not rebuilding anything. You're evaluating visual identities on a structure that's already resolved.

When you land on a combination — Nightfall's typography over a warm editorial palette, or a brutalist shape system in electric neon — The Briefing assembles automatically. It's a ~1,700-character five-section constraint prompt (Typography, Colors, Shape, Depth, Rules) that you paste into Bolt's session starter. The AI has a complete rule set. Every component it generates from that point forward operates inside your system, not Tailwind's defaults.

The Briefing for a brutalist seed's depth section, for reference:

DEPTH Shadow: 4px 4px 0px #1A1A1A — hard offset shadow. No blur. The shadow is a solid black rectangle offset down and to the right. This is the brutalist signature. No gradients, no glows, no soft shadows anywhere.

That's not a vibe description. That's a constraint. Bolt reads constraints. Bolt ignores vibes.

The One Upgrade Left

Your app is genuinely impressive. The speed at which you built it is impressive. The aesthetic is the last gap between “functional prototype” and “product people take seriously” — and it's also the solvable gap. It doesn't require design expertise, design software, or a second person. It requires design tokens.

The developers whose Bolt projects don't look generic aren't better at prompting. They're better at constraining. They gave Bolt walls before they started building rooms.

Fifteen minutes. globals.css. One token block. The entire visual register of your project shifts, and you never touch a component.

Start exploring at seedflip.co. Free tier, unlimited flips, The DNA exports free for every seed. Find the system. Drop it in. Ship the thing that looks like you meant it.

Ready to stop guessing?

One flip. Complete design system. Free CSS export.

Find your design system at SeedFlip →