All posts
AI toolsAnti-slopUI design

How to Ship Tasteful UI with v0 (Without the Slop)

Ship tasteful UI with v0 in 2026 — shadcn patterns, design constraints in prompts, when to hand off to Cursor, and how Agent's Design templates reduce slop.

AD
Agent's Design

Shipping tasteful UI with v0 means treating it as a constrained component draft tool — not a full design system. Paste DESIGN.md rules into every generation, build one section at a time, lean on shadcn patterns deliberately, then hand off to Cursor or Claude Code for token normalization and repo integration. v0's polish defaults help components; your specs prevent generic pages.

v0 is Vercel's UI generator for React and Tailwind. It is fast, visual, and biased toward shadcn-style blocks. This guide covers how to use that bias well — and when to leave v0 for a real codebase.

What v0 is (and is not)

v0 isv0 is not
A rapid React/Tailwind component generatorYour source-of-truth design system
Strong at isolated sections (hero, pricing, dashboard cards)Reliable for full-page consistency without a spec
Useful for visual exploration and stakeholder previewsA replacement for repo-native agents
Export-friendly shadcn-oriented codeGuaranteed to match your app's routing and data layer

v0 sits upstream of Cursor and Claude Code in many workflows: explore here, integrate there. The slop problem appears when teams treat exported blocks as finished pages without a shared spec.

Why v0 still produces slop

Individual v0 components often look polished. Full pages assembled from twelve independent generations look templated — same card radius, mismatched type scale, sections that do not share rhythm.

Default v0 output skews toward:

  • shadcn defaults without your brand tokens
  • Attractive heroes that ignore your nav and footer context
  • Repeated card patterns because each generation optimizes locally
  • Light-mode consumer SaaS aesthetics unless you constrain dark/dev themes

v0 is not immune to AI slop. It is optimized for component beauty, not page-level craft. Taste at the page level still comes from you — via DESIGN.md constraints and disciplined section scoping.

The tasteful v0 workflow

1. Define constraints before opening v0

Write or copy a spec before generating anything. Minimum viable constraint set:

  • Type scale — display size, body size, muted text treatment
  • Color roles — background, surface, border, accent (hex or Tailwind token names)
  • Layout — max width, section padding, grid behavior
  • Anti-patterns — explicit nos: gradients, shadow-lg cards, icon circles, purple accents

Pull a starting spec from the Agent's Design gallery or build one with the DESIGN.md guide.

2. Generate one section per prompt

Never ask v0 for an entire marketing site in one shot. Section scoping matches how v0's strengths map to output quality.

Recommended order:

  1. Hero
  2. Social proof strip
  3. Features (bento, not three identical cards)
  4. Pricing
  5. FAQ
  6. Footer CTA

Each prompt should include the same token block copied from DESIGN.md so sections can merge later without visual whiplash.

3. Paste design constraints into every v0 prompt

v0 does not read your repo. Everything important must be inline.

Template structure:

Stack: React, Tailwind, shadcn/ui components.

Design constraints:
- Background: [token]. Surface cards: [token]. Border: [token].
- Font: [family]. Headline: [size/weight]. Body: [size/line-height].
- Max content width: [px]. Section vertical padding: [px].
- Primary CTA: solid accent, no gradient fill.
- Do not use: purple gradients, drop shadows, icon-in-circle feature cards.

Task: Build [section name] only. [Layout details from gallery prompt.]

Append anti-slop lines from design prompt patterns. Specificity beats "make it clean and modern."

4. Export, then normalize in your repo

v0 exports are drafts. Before shipping:

  • Map colors to your CSS variables or Tailwind theme
  • Align spacing to your DESIGN.md rhythm
  • Replace shadcn imports with your project's component paths
  • Wire routing, links, and data — v0 will not

This normalization step is where Cursor or Claude Code takes over. See designing UI with Cursor and design better UI with Claude Code.

shadcn patterns: use the bias, do not fight it

v0 is deeply aligned with shadcn/ui — Button, Card, Dialog, Sheet, Tabs, Accordion. That is a feature if you commit to shadcn in your app.

Patternv0 strengthConstraint to add
CardFast polished surfaces"border only, no shadow-lg"
ButtonClear hierarchy variants"one primary per section"
Accordion FAQClean typography-led FAQ"no icons in accordion triggers"
Sheet / DialogMobile nav and modals"match nav tokens from DESIGN.md"
TabsSettings and pricing toggles"underline style, not pill tabs"

If your production app uses HeroUI or another library, still generate layout in v0, then reimplement primitives during Cursor integration — or generate in v0 for structure reference only.

Pick one library per project. Mixing shadcn exports with HeroUI production components without a translation step creates inconsistent focus rings and padding.

When to leave v0 for Cursor or Claude Code

Stay in v0 for exploration. Leave for integration and consistency.

Stay in v0Move to Cursor / Claude Code
Trying three hero layoutsMerging hero into app/page.tsx
Client preview of a pricing blockHooking pricing to real Stripe data
Dashboard card visual variantsSidebar layout across ten routes
Non-engineer drafting sectionsToken rename across all components
Quick shadcn component spikeAccessibility pass and semantic HTML fixes

The handoff message to Cursor might be:

@DESIGN.md Integrate this v0-exported hero into components/landing/hero.tsx. Normalize all colors to theme tokens. Do not change layout structure. Use our Button from @components/ui/button.tsx.

v0 is the sketchpad. Your repo agent is the production shop.

Feeding design constraints from Agent's Design

Gallery templates are especially valuable in v0 because v0 cannot @-reference your repo. You copy constraints into each prompt.

Workflow:

  1. Browse the Agent's Design gallery by layout and mood
  2. Copy the agent prompt section structure (hero split, bento grid, etc.)
  3. Copy DESIGN.md token blocks into a snippet you paste above every v0 generation
  4. Export sections; integrate in Cursor with the same DESIGN.md committed
Without gallery inputWith template + DESIGN.md
Pretty isolated cardCard that matches page rhythm
Generic SaaS heroSplit hero with proof strip per spec
Mismatched section spacingShared padding tokens across exports

Pro templates (~$89) help when you ship client landing pages regularly — niche layouts and deeper specs, same paste-into-v0 workflow.

v0 + Cursor: a practical combined stack

A stack that works for many indie hackers and small teams:

  1. v0 — generate hero and pricing variants (2–3 options each)
  2. Pick one — based on hierarchy and whitespace, not gradient flashiness
  3. Cursor — integrate, normalize tokens, build nav/footer shell
  4. DESIGN.md — single source of truth from gallery export
  5. Checklistanti-slop review before deploy

v0 saves time on visual optionality. Cursor saves time on correct file structure. Neither saves you from skipping the spec.

For tool selection across v0, Cursor, and Claude Code, see Cursor vs Claude Code vs v0.

Section prompts that reduce slop in v0

Hero without gradient

Hero: 50/50 split, copy left, product mockup right. Solid background using [surface token].
Headline max 8 words. Subhead max 2 lines. One primary button, one text link.
No gradient, no blob backgrounds, no floating UI glass cards.

Bento features (not card grid)

Features: bento grid, 4 cells, one 2x2 large cell. border rounded-lg, no shadow.
Each cell: title + one sentence. No lucide icons in circles.

Pricing with hierarchy

Pricing: 3 tiers, center tier emphasized with border accent not scale transform.
Feature lists left-aligned, checkmarks muted. One CTA per tier.

More patterns in design prompts for better UI.

Common v0 mistakes

MistakeOutcomeFix
Full page in one promptInconsistent sectionsOne section per generation
Different tokens each promptFrankenstein pagePaste same DESIGN.md block every time
Export → ship without integrationBroken routing, wrong importsNormalize in Cursor first
Twelve variants, no selectionEndless tweakingPick one, integrate, iterate in repo
Ignoring mobileCramped heroesSpecify stacked layout in prompt

FAQ

Is v0 enough for a production SaaS landing page?

It can be the draft layer. Production needs your repo, real links, analytics, accessible markup, and token consistency — usually finalized in Cursor or Claude Code.

Does v0 only output shadcn?

Mostly shadcn-oriented React + Tailwind. Plan for translation if your app uses a different component library.

How do I keep v0 sections visually consistent?

Same constraint block every prompt; same type scale numbers; export only after side-by-side comparison in v0's preview; final pass in repo against DESIGN.md.

v0 vs Cursor for a solo developer?

v0 if you want fast visual options without local setup. Cursor if you already have a repo and want edits in place. Many solos use both sequentially.

Can I use Agent's Design templates only in Cursor?

No — prompts and DESIGN.md paste into v0, Claude Code, Codex, Bolt, and Lovable. The gallery is tool-agnostic design input.

Ship tasteful UI by constraining v0

v0 rewards specificity. It punishes vague "startup landing page" requests with the same slop every other generator produces.

Paste DESIGN.md constraints into every section prompt, generate one block at a time, export with a plan to normalize, and hand off to Cursor or Claude Code when the work shifts from exploration to integration.

Start from a template in the Agent's Design gallery — copy the spec once, run it through v0, finish in your repo. Tasteful UI is not about avoiding v0. It is about not letting v0 guess what you never defined.

Ship the next screen with taste

Browse agent-ready templates, DESIGN.md specs, and prompts in the gallery — then paste into Cursor, Claude Code, or v0.

Keep reading