v0 by Vercel: The Complete Guide (2026)
How to use v0 by Vercel to turn a prompt into a working shadcn/ui interface, then ship the code to a real production repo.
Who this is for: developers and product people who want a fast, opinionated way to go from a UI idea to real React code without hand-rolling every component, and who are willing to accept a Next.js + Tailwind + shadcn/ui stack in exchange for speed.
v0 by Vercel is a prompt-to-UI tool: you describe a screen, it generates a working React component built on shadcn/ui and Tailwind, and you can keep iterating in chat until the layout, states, and copy are right. It is not a full app builder like Bolt or Lovable, and it is not trying to be - v0's real job is producing production-grade front-end code fast, which you then wire to your own backend, auth, and data layer. This guide covers the actual workflow: prompting, the component model it uses, exporting to a codebase, where it breaks down, and when it is the wrong tool.
What v0 by Vercel actually generates
Every v0 output is a Next.js App Router page or component, styled with Tailwind CSS, built from shadcn/ui primitives (Button, Card, Dialog, Sheet, DataTable, etc.). Under the hood it is fine-tuned to produce idiomatic shadcn compositions rather than raw divs with inline styles - this is the single biggest reason its output looks like a real product instead of a Bootstrap template.
Key facts as of mid-2026:
- v0 ships as both a standalone web app (v0.dev) and a model you can call via the Vercel AI SDK / API (
v0-1.5-md,v0-1.5-lg) if you want to build your own prompt-to-UI flow. - Free tier gives limited daily generations; the Premium plan runs $20/month and Team plans add seats plus higher generation quotas, billed on top of your existing Vercel plan.
- Generations are versioned - every prompt-response pair is a "version" of the chat, and you can fork back to an earlier version if a later edit made things worse. This matters because iterative prompting sometimes regresses a component that was previously fine.
- Output includes real, runnable code you can copy, download as a zip, or push straight into a connected GitHub repo.
Tip: v0 defaults to shadcn/ui's default theme (zinc/slate neutrals). If your brand isn't neutral-gray, tell it your palette and font in the very first prompt - retrofitting brand colors after 15 generated components is more tedious than front-loading them.
Writing prompts that actually produce usable output
Vague prompts produce generic dashboards. The pattern that works consistently:
- State the object and its fields - "a pricing table with 3 tiers, each showing plan name, monthly price, a feature list of 5 items, and a CTA button" beats "make me a pricing section."
- Name the shadcn components you expect - if you know you want a
Sheetfor mobile nav and aCommandpalette for search, say so. v0 will reach for the right primitive instead of a custom equivalent. - Specify states explicitly - loading, empty, and error states are the most commonly skipped output. Ask for them by name: "include a skeleton loading state and an empty state with an illustration placeholder."
- Give real copy, not lorem ipsum - if you paste your actual headline and body copy into the prompt, you skip an entire editing pass later.
Build a customer-facing invoice list page using shadcn/ui.
Table columns: Invoice #, Client, Amount (ILS), Status (badge: paid/overdue/draft), Due date.
Include: a search input above the table, a status filter dropdown,
a "New Invoice" button top-right, and pagination at the bottom.
Show a skeleton loading state and an empty state that says
"No invoices yet - create your first one."
Use a blue/slate palette, not the default zinc theme.
That level of specificity is what separates a v0 session that saves you three hours from one that leaves you rewriting half the markup.
The iteration loop
v0 works like a chat, and the loop that actually converges fast looks like this:
- First prompt generates a baseline component.
- Look at the live preview (v0 renders it in an iframe next to the chat) before touching code.
- Give targeted diffs, not re-descriptions: "make the status badge use red for overdue and green for paid" works better than re-pasting the whole spec with one word changed.
- Use the built-in element selector (click a rendered element to reference it in your next message) instead of describing position in prose - this cuts down on v0 misidentifying which element you mean.
- Fork to a previous version if an edit broke something rather than trying to prompt your way back.
Warning: v0 sometimes "fixes" one part of a component by quietly rewriting unrelated JSX. Diff the generated code against the previous version before accepting, especially past component #5 or so in a session - context drift is real.
Exporting to a real codebase
This is the step people skip and then get burned by. v0 gives you several exit paths:
- Copy the code block directly into an existing Next.js project - fastest for a single component, but you own resolving import paths and missing shadcn primitives yourself.
- Download as zip - gives you a runnable Next.js project scaffold, useful for greenfield work or a quick prototype repo.
- Push to GitHub - if you connect a repo, v0 can open a PR with the generated files, which is the cleanest path for teams that want code review before merge.
- Deploy straight to Vercel - one click from the chat, useful for a client-facing preview link but not a substitute for actually reading the code.
Before merging anything, run npx shadcn@latest add <component> locally to make sure every primitive v0 referenced is actually installed in your project - v0 assumes a fully-populated shadcn setup, and a fresh project is usually missing half of what a generated page imports.
# after pulling generated code into your repo
npx shadcn@latest add button card dialog sheet table badge
npm run dev
Then wire the component to real data: v0's tables and forms come with mock arrays or hardcoded values, and replacing those with a fetch call, a server action, or a Prisma query is entirely on you.
Where v0 fits versus other AI builders
| Tool | Best for | Output | Backend/data |
|---|---|---|---|
| v0 by Vercel | Polished UI components, dashboards, marketing sections | Next.js + Tailwind + shadcn/ui code | None built-in - you connect your own |
| Bolt.new | Full-stack app scaffolding fast, in-browser | Runnable multi-file app (various stacks) | WebContainer-based, can include backend |
| Lovable | End-to-end app with Supabase baked in | Full app, hosted | Supabase auth/DB included |
| Cursor / Claude Code | Working inside an existing large codebase | Diffs against your repo | Whatever you already have |
v0 is narrower than Bolt or Lovable on purpose. It does not manage a database, auth, or deployment pipeline for you (beyond hosting on Vercel) - it is a UI generator that happens to output real, mergeable code. If you want a full working app with a backend in one session, see our vibe coding tools shootout for how it stacks up against Bolt and Lovable directly, or read when vibe coding is the right call before picking any of these for something client-facing.
Common mistakes
- Accepting the default zinc theme and reskinning later. Rebrand colors, radius, and font in the first prompt - retrofitting a dozen components afterward costs more time than it saves.
- Not checking for duplicate shadcn installs. If you generate multiple components across separate v0 sessions and paste them into one project, you can end up with slightly different versions of the same primitive (e.g. two
Buttonvariants). Reconcile against your actualcomponents/uifolder. - Treating generated forms as production-ready. v0 rarely adds real validation - see our guide on prompt-to-app common mistakes for the pattern of AI-generated forms that look done but silently accept garbage input.
- Skipping accessibility review. shadcn primitives are Radix-based and accessible by default, but custom layout v0 adds around them (spacing, focus order, contrast) still needs a pass - our RTL and accessibility guide covers what to check even for LTR projects, since the underlying a11y checklist is the same.
- Merging without running the checklist. Before anything generated by v0 goes to production, run it through the same gate you'd apply to any AI-generated diff - see vibe code to production checklist.
Pricing and limits in practice
The free tier is genuinely useful for evaluating whether v0 fits your workflow, but daily generation caps mean you'll hit a wall mid-project. Premium at $20/month removes most friction for a solo developer; Team plans add per-seat billing and shared project history, which matters once more than one person is iterating on the same component library. Because v0 also exposes an API model (v0-1.5-md/lg), teams building their own internal design tool sometimes call it programmatically rather than using the chat UI at all - worth knowing if you're evaluating build vs. buy for an internal tool. For a broader view of what AI coding tools cost across the board, see AI model pricing compared.
FAQ
Is v0 by Vercel free to use?
There's a free tier with a daily generation limit, enough to evaluate the tool on a small component or two. Serious use - multiple pages, longer iteration sessions - generally needs the $20/month Premium plan or a Team plan for shared quotas.
Does v0 generate a full backend, or just the UI?
Just the UI. v0 outputs Next.js/React/Tailwind/shadcn code with mock data wired in; connecting it to a real database, auth provider, or API is left entirely to you. If you want backend generation included, tools like Lovable or Bolt.new are closer to that model.
Can I use v0 output outside of Next.js?
The generated JSX is portable to any React project with Tailwind and shadcn/ui installed, but the App Router conventions (server components, file-based routing) assume Next.js. Porting to plain Vite React or Remix means manually adapting those parts.
How is v0 different from just using shadcn/ui directly?
shadcn/ui gives you a CLI to install individual accessible components; v0 composes many of those components into a full working screen from a text prompt, saving you the layout and composition work. You still end up with the same underlying shadcn primitives either way.
Can teams collaborate on the same v0 project?
Team plans support shared projects and chat history across seats, which is useful for keeping a design system consistent across a small team. It is not real-time multiplayer editing like Figma - collaboration happens by revisiting the same chat thread or PR.
Is v0-generated code safe to ship straight to production?
Not without review. Treat it like any AI-generated pull request: check for missing validation, accessibility gaps, and hardcoded mock data before merging. Our vibe code to production checklist covers the specific gate to run it through.
Get help wiring it up
If you've got a v0-generated interface and need it connected to a real backend, auth, and data layer - or want a second opinion on whether v0 is the right tool for your project - grab a free 30-minute call through the contact form or message us directly on WhatsApp.