AI writes UI code fast and with total confidence, which is exactly why it’s dangerous. Used well, it’s the best junior pair you’ve ever had — it takes the boring 80% while you keep the taste. Used lazily, it fills your app with plausible-looking code that breaks in ways you never read closely enough to catch.
A fast, literal junior
That’s the mental model that keeps me honest. A junior who types 200 words a second, never gets tired, and never once says “I’m not sure about this.” You’d never merge a junior’s PR unread. This is the same deal, just faster.
Where it earns its keep
Point it at work you’ve done a hundred times and it flies:
- Scaffolds: the tenth modal, the fourth data table, structure you could write in your sleep.
- Variants: “give me this card in three densities” beats copy, paste, tweak, repeat.
- Translation: a Figma spec or a wall of Tailwind classes into a first-pass component.
- Boilerplate: prop types, Storybook stories, and test stubs.
Review it like a PR
The failures are subtle because the output looks correct. Here’s a real one it handed me last week:
// what the model gave me
<div className="card" onClick={openModal}>
<img src={cover} alt="" />
<span>{title}</span>
</div>Renders fine, ships a trap: no keyboard access, no focus ring, no role. Someone on a screen reader can’t open that modal. I catch it because I read every line, not because the model warned me.
Where it stalls
It’s weakest exactly where the work gets interesting: a novel interaction with no precedent in its training data, the call on whether spacing that’s 4px off actually matters, whether a pattern fits the system you’ve already built. Taste doesn’t fall out of a model. That part is still yours.
The rule
Generate freely, merge nothing on trust. Every AI diff gets the same review a teammate’s would: read it, run it, check the states, tab through it once. The speed is real and worth having. The accountability for what ships is still entirely yours.