Why do v0 sites all look like default shadcn/ui?

v0 is Vercel's AI tool for generating web interfaces, and its output usually arrives as React for Next.js, styled with Tailwind and built from shadcn/ui components. Those are good defaults, and they are everyone's defaults, so a v0 landing page left as generated shares its radius, palette, spacing and section order with a great many others, and its copy lands on the median SaaS voice. The look is fixed in the theme and the prompt. IntentGrid handles the words: it rewrites them for each visitor and leaves the components alone.

Last updated 2 October 2026.

Where the v0 look comes from

The sameness is not a v0 bug. It is what you get when a very good component library is used with its settings untouched.

  • shadcn/ui as the base. The components are copied into your project and styled through a small set of CSS variables for background, foreground, primary, muted, border and radius. Left at their defaults, every project gets the same neutral palette and the same corners.
  • Tailwind's default scale. Spacing, type sizes and shadows come from the same scale on every project, so even custom sections feel familiar.
  • A component-shaped brief. v0 is very good at “a pricing section with three tiers” and “a hero with a call to action”, so pages get assembled from exactly those blocks, in the order people ask for them.
  • Copy as placeholder. Generated text is there to show the layout working. “Everything you need to scale” is filler, and it ships more often than anyone intends.

None of this is hard to undo. Most of it lives in one CSS file and one paragraph of prompt.

What IntentGrid changes on a v0 site, and what it leaves

IntentGrid rewrites the text a visitor reads: headlines, body copy, feature descriptions and button labels, written for how that person arrived (traffic source, campaign, approximate city, device, language, local time). It starts from the copy already on your page, and brand names, prices, dates and numbers are on a do-not-touch list.

It leaves your shadcn/ui components, your theme variables, your Tailwind classes and your layout exactly as they are. It does not touch your v0 project, and it will not make default styling look custom: that is a theme change, covered below.

The working part today is a demo that renders a rewritten copy of any public URL in a sandbox on intentgrid.ai; adaptation on your own domain is early access, set up per site by hand. How it works explains the difference.

What the demo can read from a v0 site

A v0 project deployed as a Next.js app renders its pages on the server or at build time, and that includes components marked as client components, so the copy is in the HTML response and the demo can rewrite it. Paste the public URL of the deployed site, not a link to the v0 chat or editor.

The exceptions are the same as in any React app: text fetched in the browser after the page loads, and content that only renders after a click, such as an unopened tab, a closed dialog or a later carousel slide. The demo strips scripts, so it sees the page as it first arrives.

An illustrative before and after

Illustrative example: a made-up meeting-notes app, not a real site and not a recorded run.
Default, the same for everyone
Everything you need to run better meetings
Arrived from a remote-work newsletter, on a laptop, mid-morning
Notes and action items from every call, without anyone taking them
Clicked a search ad for “meeting transcription”
A transcript of every meeting, with the action items already pulled out

Same components, same prices, same claims. Every version uses only what the original page already says: in this made-up case, automatic notes, transcripts and extracted action items.

Fixes you can make in v0 and in the code

Most of the v0 look comes down to a couple of files and one habit.

  • Change the theme variables. Pick your own primary colour, background, border and radius in the CSS variables shadcn/ui reads. It is the largest visual change for the smallest edit.
  • Replace the default font. One import and one variable, and the page stops reading as a starter.
  • Ask v0 for one section that is not a card grid: a single large product screenshot, a comparison list, a quote from a real user. One unusual section makes the rest look chosen.
  • Give the prompt a reader, not a component list. Say who the page is for and what they are switching from, and ask for copy that names it.
  • Delete the filler. Search the page for “everything you need”, “seamless”, “powerful” and “at scale”, and rewrite every sentence that contains one.

Why defaults converge across every AI tool, and the rest of the design fixes, are in why vibe coded websites look the same.

v0 questions

Can the IntentGrid demo read my v0 site?

Paste the URL of the deployed, public site. The demo fetches pages the way an anonymous browser would, so anything behind a login or only visible inside an editor is out of reach. A deployed Next.js page from v0 normally has its copy in the HTML, which is what the demo needs.

Will IntentGrid restyle my shadcn/ui components?

No. It changes text only. Components, theme variables, Tailwind classes, layout and prices stay as they are. In the demo it adds a welcome strip, a personalized overlay, a headline highlight and a small IntentGrid badge on top of the page.

Is a v0 site bad for SEO?

Not inherently. A deployed Next.js site serves real HTML and can set a title and description per page. What hurts is the same as anywhere: thin, generic copy that matches a thousand other pages, missing metadata, and one page trying to answer every question. IntentGrid is not an SEO tool, and on-domain adaptation is built to serve crawlers your canonical page.