Design-to-code that works: turn structured Figma files into shadcn/ui, refine in v0. How strong systems make AI reliable.

Design-to-code automation sounds straightforward. Turn designs into components. Reduce handoff friction. Ship faster.
In reality, it fails more often than it succeeds.
We usually see the same pattern. Design files drift over time. Tokens are applied inconsistently. Components exist visually but not structurally. When automation is added on top of that, it does not fix the problem. It accelerates it.
AI does not create order. It multiplies whatever structure already exists. If the system is weak, automation makes the cracks visible faster. If the system is strong, automation becomes quiet and reliable.
That is why automation is not a tooling problem. It is a structural one.
Automation does not operate on pixels. It operates on rules.
Variables, component boundaries, and naming discipline are the real inputs. When those are consistent, automation becomes predictable. When they are not, no prompt can compensate.
Free-form design files resist automation because intent lives implicitly. Spacing is visual, not semantic. Colors communicate meaning by appearance, not by role. Components look reusable but behave like one-offs.
A design system changes that. It turns decisions into constraints. It makes intent explicit.
AI does not replace those decisions. It enforces them.
Once we started treating the design system as the unit of automation, the conversation changed. Speed stopped being the goal. Predictability took its place.
Figma works best when it is not treated as a drawing tool.
In a mature system, it becomes a constraint-aware canvas. Variables define spacing, color, and type. Components encode behavior instead of just appearance. Auto layout expresses rules rather than layouts.
At that stage, designers stop pushing pixels and start composing systems. The file stops being a visual artifact and becomes a structured input.
This is also where automation becomes viable. When tokens and components already encode intent, AI has something stable to translate. Without that structure, it is guessing.
We have found that the more constrained a file is, the more reliable the output becomes. That tradeoff is usually worth it.
Handoffs tend to break parity. Even with documentation, engineers reinterpret designs. Spacing gets approximated. Variants drift. Accessibility details are reimplemented inconsistently.
The way around this is not more documentation. It is removing interpretation from the handoff entirely.
When structured Figma components are turned directly into shadcn/ui native components, the system carries through. Tokens remain tokens. Component boundaries stay intact. Accessibility defaults are preserved instead of recreated.
At that point, the Figma-to-code step stops feeling like a conversion. It feels like the same system continuing in a different medium.
We treat this step as infrastructure. It should be quiet. It should be reliable. If it draws attention to itself, something upstream is usually wrong.
Once code exists, iteration should stay in code.
Design does not end when components are generated. It stabilizes there. Layout refinements, interaction details, and edge cases belong closer to implementation than the canvas.
Opening generated components in v0 allows refinement without breaking shadcn/ui patterns or reintroducing drift. It keeps iteration inside a controlled environment that respects the system.
The important part is not the tool itself. It is the loop.
Design intent flows from Figma into code, then evolves in code, without snapping back to screenshots or manual rewrites. When that loop stays intact, the system holds.
AI is strong at translating structured intent. It is good at repeating patterns. It is reliable when the rules are clear.
AI is weak at resolving ambiguity. It cannot infer missing decisions. It cannot fix a broken system.
That is why constraints are what make AI useful. They narrow the space of possible outputs. They turn generation into enforcement instead of invention.
We tend to judge automation setups by how boring they are. If the output is consistently unremarkable, the system is doing its job.
Speed without stability creates rework. It creates drift. It creates UI that looks consistent until it isn’t.
Predictable pipelines age better. They scale with teams. They make automation easier over time, not harder.
When design and code share the same constraints, automation stops being a goal. It becomes a side effect.
That is usually when teams realize they were solving the wrong problem all along.
Founder @ shadcndesign.com

How shadcn/ui charts actually work: what ChartContainer does, how ChartConfig drives colors, and what breaks when you move from Recharts 2 to Recharts 3.

How shadcn/ui registries actually work: registry.json, URL resolution, styles, and namespaces — explained by a team that runs a production registry.

The Default style in shadcn/ui is deprecated and New York is what new projects get. Here's what actually differed between the two, what New York looks like today, and what to do if your components.json still says default.