All posts
Product design

How to Redesign a Vibe-Coded MVP Without Rewriting It

How to redesign a vibe-coded MVP without rewriting it: design tokens, a component pass and screen-by-screen reskinning, plus when a rewrite is cheaper.

By Mehdi Hassan8 min read

The short answer

To redesign a vibe-coded MVP without rewriting it, change the design layer, not the logic. Inventory every screen, define design tokens, consolidate components so each exists once, then reskin screen by screen starting with the core flow. Rewrite only when the structure under the screens, not their look, is what's broken.

Key takeaways

  • Most AI-built apps already use Tailwind and shared components, so a reskin can work through tokens instead of rewriting pages.
  • Inventory screens and states before designing anything; the count of duplicates tells you the real scope.
  • Fix one component and every screen using it improves. Fix one screen and you've only fixed one screen.
  • Reskin the core flow first and ship each screen as it's done, so the product never freezes.
  • A rewrite is cheaper only when the data model or component tree is the problem, not the visuals.

Part of MVP Design and Development: The Founder's Guide to Building Version One

How do you redesign a vibe-coded MVP without rewriting it?

You redesign a vibe-coded MVP without rewriting it by separating how the app looks from how it works, then changing only the look. The logic, data and flows users already validated stay in place. The redesign happens in three layers: design tokens, shared components, and the screens built from them.

This works because AI builders rarely produce unstructured code. Apps from Lovable and v0 are usually built with Tailwind CSS and shadcn/ui components, so colors, radii and spacing already flow through a theme, even when individual screens ignore it. Your job is to make every screen obey that theme, then change the theme. For where this fits in a product's life, see our MVP design and development guide.

Why do vibe-coded apps look inconsistent?

Vibe-coded apps look inconsistent because each prompt produces a plausible screen on its own, and nobody designs the whole. The tool fixes the button in front of it by writing a new one, so over time you get several buttons, several modals and several spacing systems that almost match.

  • Hard-coded values. Colors and sizes typed directly into a screen instead of read from the theme, so changing the theme misses them.
  • Forked components. A shared Button exists, but half the screens use a copy with small edits.
  • The default look. The starter theme ships untouched, so the app looks like many others built the same way.
  • Missing states. Empty, loading and error states were never asked for, so they're blank screens or raw messages.
  • Copy in several voices. Every prompt wrote its own labels, and they don't agree on tone or terms.

None of these need new logic. They need a system, and the discipline to route every screen through it. Our guide to how polished MVP design should be helps you decide how far to take it.

How do you audit the interface before redesigning?

You audit the interface by capturing every screen in every state, then grouping repeated elements so you can count the duplicates. The audit sets the scope: an app with two button variants needs a light pass, one with nine needs a component pass first.

  1. Capture every screen and state

    Walk the app as a new user, a returning user and an admin. Screenshot each screen, plus its empty, loading and error versions, and any modal or toast.

  2. Group repeated elements

    Put all buttons side by side, then all inputs, cards, modals, tables and navigation. Note every variant that differs without a reason.

  3. Find the hard-coded values

    Ask a developer, or your coding tool, to list colors, font sizes and spacing typed directly into screens rather than read from the theme. This is the hidden work in a reskin.

  4. Mark the core flow

    Highlight the screens on the path to your product's main job. They get redesigned and shipped first.

How do design tokens make a reskin possible?

Design tokens make a reskin possible because they turn hundreds of style decisions into a few named values that every component reads. Change the primary color token once and every button, link and focus ring follows. Without tokens, a redesign means editing each screen by hand.

In a typical shadcn/ui setup, tokens are CSS variables such as background, foreground, primary, muted, border and radius, defined in the main stylesheet and mapped to Tailwind. On Tailwind v4 they sit in an @theme block in CSS; older projects map them in a tailwind.config file. Start by moving every hard-coded value you found into one of these tokens, which should change nothing visually.

Then design the new direction in Figma using variables with the same names as the code tokens. Define color for light and dark modes, a type scale, a spacing scale, radii and shadows. When the names match, handing the design to code is a list of value changes, not an interpretation exercise.

What to put in your AI tool's instructions so it stops undoing the redesign

If you keep prompting after the redesign, the builder can drift back to old habits. Most AI builders and coding agents read project-level instructions, so write the rules down where the tool will see them.

Useful rules: use only theme tokens for color, spacing and radius, and never hard-code values. Use the existing components in the shared components folder; extend them with a variant instead of creating a copy. Every list and data view needs an empty, loading and error state. Button labels start with a verb and use the product's terms.

Review new screens against the inventory anyway. Instructions reduce drift; they don't remove it.

How do you run the component pass?

You run the component pass by choosing one canonical version of each repeated element, giving it the variants the product needs, and replacing every copy with it. Do this before reskinning screens, because every component you fix improves every screen that uses it.

Work from the most-used element down: buttons, inputs and form fields, then cards, modals, tables and navigation. For each one, design the variants in Figma (primary, secondary, destructive, sizes, disabled and loading), update the shared component in code, then swap the forked copies for it. Check each swap with before-and-after screenshots so nothing breaks quietly.

Pros

  • Keeps the logic, data and validated flows untouched
  • Each change ships on its own, so the product keeps moving
  • Later screens inherit the system without extra design work
  • Works with the AI builder or a coding agent still in use

Cons

  • Can't fix a broken data model or tangled component tree
  • Hard-coded values make the first pass slower than expected
  • Needs someone to review drift for as long as you keep prompting

How do you reskin a Lovable app screen by screen?

You reskin a Lovable app screen by screen once tokens and components are in place: apply the new layout and hierarchy to each screen in the core flow, add its missing states, rewrite its copy, and ship it before moving on. The same method works for apps from v0, Bolt or any React codebase.

  1. Sign-up and first run. The first screens decide whether people stay, so they get the most care, including the empty state a new account sees.
  2. The core job. The screens where users do the thing they came for, with loading and error states designed rather than left to defaults.
  3. Results and sharing. Where users see value and show it to others.
  4. Billing and settings. Plain, consistent and trustworthy, especially anywhere money is involved.
  5. Everything else. Secondary screens usually need little beyond the new components.

Rewrite the copy as you go, not at the end. Interface text is part of the design, and AI-written labels are often the most generic part of the app. If your product has AI features, our guides to AI product UX and AI chat interface design cover the patterns those screens need.

When is a rewrite cheaper than an MVP redesign?

A rewrite is cheaper than an MVP redesign only when the problem sits under the screens: a data model that can't express your product, a component tree so tangled that each change breaks something unrelated, or core flows users have rejected. If the flows work and only the look fails, reskinning is almost always cheaper.

Approach

Choose it when

What stays

Reskin

Flows work; visuals and consistency don't

Logic, data, flows, most code

Restructure some screens

A few flows confuse users; the rest are fine

Data, logic, the design system

Rewrite

Data model or code structure blocks every change

What you learned, copy, and user data via migration

Most apps end up mixed: a reskin across the board and a few restructured screens. If you're unsure which side you're on, vibe coding vs hiring a team lists the structural warning signs. Our product design service covers redesigns where we also ship the code.

Frequently asked questions

Can I redesign my app inside Lovable instead of in Figma?
You can make visual changes by prompting, and for small tweaks that's fine. For a real redesign, design the system first, in Figma or as written rules, then apply it. Prompting screen by screen without a system is how the drift happened, so it rarely fixes it. Use the builder to apply token and component changes you've already decided.
Do I need a design system for a vibe-coded MVP?
You need a small one: tokens for color, type, spacing and radius, plus the dozen or so components the app actually uses, each with its states. That's enough to stop drift. A full documented system with usage guidelines can wait until you have more designers or engineers working in the product.
Will users be confused by a redesign?
Not if you keep the flows and change the skin. Users learn where things are, not what color they are. Shipping screen by screen also helps, because each change is small. If you move navigation or restructure a flow, tell users in the product and test the new version with a few of them first.
How do I keep the redesign from drifting again?
Write the design rules where your AI tool will read them, review new screens against the component inventory, and fix forks as soon as they appear. The cheapest prevention is making the shared components easy to extend with variants, so the tool has no reason to create copies. Someone still has to look at every new screen.
Should I redesign the marketing site at the same time?
Only if the brand itself is changing. A product reskin and a marketing site redesign share tokens and type, so doing the brand work once and applying it to both saves effort. If you're only fixing product consistency, leave the site alone and keep the redesign focused on the screens users work in every day.

· CEO & Design Director

Copywriter, designer and developer, and founder of Designify Studio. Over five years, 60+ projects across 14+ industries, for startups that have raised $300M+.

Want this done for you? Brand & design sprint, $3,000.

A brand refresh or redesign, plus design explorations for your website and product. $3,000, one-time, fixed price. Book a free 30-minute call to see if it fits.

Schedule Call