How Good Is AI at Coding React (Really)?

December 29, 2025

tl;dr: AI coding benchmarks show models excel at isolated React tasks like scaffolding components or implementing explicit specs, achieving ~40% success in benchmarks, but drops to ~25% on multi-step integrations due to a “complexity cliff” in state management and design taste. The gap between “AI helped me ship” and “AI gave me a mess” is context engineering and explicit constraints. Deep React and domain knowledge enable you to spot when AI goes off the rails and understand why it repeats mistakes. Guide it without blindly accepting the output.

This article is based on my closing keynote at React Summit by GitNation (video).


The Question everyone’s asking (but nobody’s answering well)

Let me be direct: most conversations about AI and coding are stuck on vibes. Either AI is magic that will replace us all, or it’s garbage that can’t do anything useful, or it’s perpetually “one prompt away” from shipping production code. All three takes miss what’s actually interesting.

After spending a year analyzing benchmarks, building with these tools at Google, and watching React developers struggle (and succeed) with AI assistants, here’s what I’ve learned: AI is already useful for React developers, but its usefulness is extremely uneven. The unevenness is predictable if you know what to look for.

Slide titled 'AI CODING AND DESIGN BENCHMARKS' in white capitals on black, showing a two-by-two grid of small screenshots of benchmark leaderboard websites. Top left is a DesignArena 'Model Performance' page with a bar chart of model ratings. Top right is a 'WebDev Leaderboard' table listing ranked models with scores, votes, organization and license columns. Bottom left is the 'Web-Bench Leaderboard' page with descriptive text and filter panels. Bottom right shows the SWE-bench site with a sidebar of benchmark variants and an 'Official Leaderboards' results table. Individual text is too small to read at this size.

More importantly - and this is the part most articles skip - you have far more control over outcomes than you think.

The Core Thesis: Two sides of the same coin

This article covers two critical angles:

What the data tells us: Benchmarks like Design Arena, Web Dev Arena, SWE-Bench, and Web-Bench reveal clear patterns about where AI excels (isolated components, scaffolding, implementing explicit requirements) and where it struggles (multi-step integration, design taste, complex state management). Understanding these patterns means you can predict what will work before you waste time.

What you can control: The difference between “AI helped me ship” and “AI gave me a mess to untangle” almost never comes down to just model selection. It comes down to context engineering, prompt specificity, workflow structure, and guardrails. These are all in your power to fix.

Let’s start with the foundation.

Slide on black reading 'LLMS DETERMINE THE CEILING OF WHAT A FRAMEWORK CAN ACHIEVE.' in bold white capitals with 'CEILING' highlighted in yellow. At the lower left, a photo of a man in a black t-shirt holds both arms up as if supporting the word 'CEILING' above his head. His shirt is printed with the phrase 'You're Absolutely Right!' above an orange asterisk-style starburst logo.

90% of developers use AI for coding in some way. In an AI-assisted world, the value of frameworks like React depends on how effectively AI can use them. If AI can’t handle a framework well, that means the quality of experiences you can build without a lot of manual work can be limited.

Slide on black reading 'FIND THE SMALLEST POSSIBLE SET OF HIGH-SIGNAL TOKENS THAT MAXIMIZE THE LIKELIHOOD OF YOUR DESIRED OUTCOME' in large white capitals, with 'HIGH-SIGNAL TOKENS' and 'OUTCOME' picked out in yellow. Three gold coins stamped with the letters 'GPT' float in the right-hand area of the slide as a visual pun on tokens.

A lot of AI code quality comes down to context. You want to squeeze the most value out of the token budget in your context window. But the model, the tools that sit on top of it all of these layers play an important role.

AI Changes what is easy, not what is true

AI is a force multiplier. It amplifies everything: good requirements, good architecture, good taste. It also amplifies the bad: vague specs, messy state, and the temptation to ship something you haven’t really understood. Give it a weak brief, and it will happily hand you a 10,000-line maze you’ll later delete.

A contrast slide on black. On the left, the heading 'VIBE CODING' with the caption 'Use high-level prompts to rapidly generate code by trusting an AI's output, prioritizing speed over rigorous review.' On the right, 'AI-ASSISTED ENGINEERING' with the caption 'Using AI as a supervised tool within a structured development process where the human maintains full control and accountability.' Key phrases in both captions are highlighted in green. Between them runs a photograph of a glass prism splitting a white beam of light into a rainbow spectrum that fans out from left to right.

I draw a hard line between AI-assisted vibe coding and AI-assisted engineering. Vibe coding is trusting high-level prompts and prioritizing speed over review. AI-assisted engineering is integrating AI inside a structured process where the human stays in control and accountable for the output.

Why does this distinction matter for React?

Because React apps aren’t just code. They’re product behavior, user experience, reliability, security, performance, accessibility, and long-term maintenance. AI can help with all of that - but only if you treat it like a teammate you’re pairing with and have oversight over, not a vending machine dispensing code.

The Monoculture problem (and opportunity)

One of the most under-discussed parts of the AI coding story: “how well AI codes” is not a universal property. It depends on what the model has seen in training, what tools it has access to, and what the ecosystem has standardized on.

Slide headed 'IS MONOCULTURE GOOD, BAD OR GRAY?' in white capitals on black. Yellow text reads 'MOST AI TOOLS CONVERGE ON' above a white list: React, TypeScript, Tailwind CSS, shadcn/ui. Below that, in yellow: 'This stack dominates training data and tool optimization.' On the right is a stock-style photo of a grinning man in a blue tracksuit jacket and headband giving two thumbs up, wearing a white tank top printed with the blue React atom logo.

Large language models effectively set the ceiling for how much leverage you get out of a framework in an AI-assisted workflow. If AI struggles with a framework, you feel that as friction and quality limits.

Most AI tools converge on a stack that looks like: React, TypeScript, Tailwind, shadcn/ui. That stack dominates training data and tool optimization, so models are competent there and noticeably shakier off the beaten path.

This has two implications for practicing React developers:

  1. If you’re on the mainstream stack, your “AI assistance ceiling” is higher. You’ll get better scaffolds, better component generation, and fewer hallucinated APIs.
  2. If you’re not, you need to compensate with better context, doc retrieval, and stricter constraints - or you’ll watch the model confidently build an alternate universe version of your app.

Slide headed 'WHAT DOES THIS MEAN FOR THE FUTURE?' on black. Yellow text: 'Your React skills will likely stay relevant in the AI age.' White text below: 'AI models can be fine-tuned quickly if new frameworks gain traction. Docs MCPs can help in the interim.' Then: 'Human developers might deliberately push against bias.' On the right is a photo of a smiling mechanic in yellow overalls marked 'JS' on the pocket, wearing a red checked bandana and holding a large wrench and a bundle of cables.

There’s also a second-order effect: monoculture can slow innovation. React skills are likely to stay very relevant (comforting), but it also means newer frameworks or alternative patterns can face headwinds until models and tools catch up.

The good news? If a framework gains traction, AI makers will fine-tune models on it. Docs MCPs can bridge gaps in the interim. But short-term, React’s position is extremely strong because AI “knows” it best.


The Big reality check: The complexity cliff

If you remember nothing else from this article, remember this: AI handles simple tasks well and then falls off a cliff as complexity rises.

Text-only slide on black reading 'THE COMPLEXITY CLIFF: AI HANDLES SIMPLE TASKS WELL - WRITE A FORM COMPONENT, IMPLEMENT A UTILITY FUNCTION. BUT PERFORMANCE DROPS SHARPLY WITH COMPLEXITY.' set in large condensed capitals, alternating white and yellow so that the phrases 'AI handles simple tasks well' and 'performance drops sharply with complexity' stand out in yellow.

A form component, a utility function, a small isolated widget: great. Multi-step work across a real codebase: much less reliable.

I used a mix of objective and human-rated benchmarks to show this pattern. We need both, because pass/fail benchmarks tell you “can it solve the issue,” while human-rated arenas tell you something equally important for frontend work: “do humans actually want to use what it builds.”

Slide titled 'KEY BENCHMARKS WE'LL EXAMINE' on black, split into two groups. Under the yellow heading 'HUMAN-RATED TESTS': 'Design Arena: 385K+ votes across 145 countries' and 'WebDev Arena: head-to-head app builds'. Under 'OBJECTIVE TESTS': 'SWE-bench: real GitHub issues, full codebase fixes', 'Web-Bench: full-stack web projects', and 'Next.js Evals: framework-specific challenges'. On the left are two cut-out photos: a smiling woman holding up a scoring paddle showing the number 10, and a woman in a lab coat with frizzy hair and thick glasses holding a flask of blue liquid.

What The Numbers Show

On objective benchmarks, the complexity cliff is visible:

  • Next.js eval tasks: Best models around 42% success - roughly 21 of 50 tasks completed. Even on framework-specific challenges, failures are common.
  • Web-Bench multi-step full-stack tasks: Around 25% tasks solved. Many failures as steps chain together.
  • SWE-Bench Pro: Around 20-43% on the Pro public set, versus jumping to over 70% on SWE-Bench Verified. Increasing complexity collapses performance.

The gap between benchmark performance and your real codebase is the important thing to calibrate to.

Slide titled 'BENCHMARK RESULTS - NEXT.JS EVALS'. On the left, white text reads 'Best model: ~42% success rate (only ~20 of 50 tasks completed)' and yellow text reads 'Even on framework-specific challenges, AI fails more than half the time.' On the right is a screenshot of a Next.js 'Model Performance Results' table with columns Model, Total Evals and Success Rate: gpt-5-codex 50 evals 42%, Gemini 3 Pro Preview 50 42%, glm-4.6 50 40%, Claude Opus 4.5 50 40%, claude-opus-4.1 50 40%, kimi-k2-turbo 50 38%, grok-4-fast-reasoning 50 38%, grok-4 50 38%.

Slide titled 'THE COMPLEXITY CLIFF - SWE BENCH & PRO'. Left text under the yellow heading 'SUCCESS RATES' reads 'Top models score around 20-43% on the SWE-bench Pro public set, compared to 70%+ on SWE-bench Verified.' Below, in yellow: 'As complexity up, AI performance down.' On the right is a dark 'Performance Comparison' leaderboard with horizontal bars and error margins: claude-4-5-Sonnet 43.60, claude-4-Sonnet 42.70, claude-4-5-haiku 39.45, gpt-5-2025-08-07 (High) 36.30, kimi-k2-instruct 27.67, gpt-5-2025-08-07 (High) 25.90, gpt-5-2025-08-07 (Medium) 23.26, claude-opus-4-1-20250805 22.71, claude-4-Sonnet-20250514 17.65.

My practical translation of the complexity cliff for React developers:

  • AI is great at first drafts
  • AI is mediocre at integration
  • AI is unreliable at long multi-step changes unless you give it strong tooling and context
  • AI gets you to “it works” faster than it gets you to “it’s a codebase I want to own”

Design Arena and Web Dev Arena: Where React developers should pay attention

React developers spend a lot of time in the space between “the code runs” and “this is good.” That space includes UI quality, hierarchy, spacing, accessibility, and whether the end result feels intentional.

Screenshot of the DesignArena website's 'Model Performance' page on a light background. Explanatory text says each AI model is ranked using the Bradley Terry rating system, denoted as Elo rating, which adjusts based on performance in head-to-head design matchups, with higher scores indicating more consistent wins, and models marked with an asterisk subject to change. A row of category filter chips runs across the page including All Categories, Website, Game Dev, 3D Design, Data Viz, UI Component, Image, Logo, Video and Video to Video, plus Top 20, All Models, Win Rate and Elo Rating controls. Below is a bar chart of about twenty models in muted green and blue tones, led by Gemini 3 Pro Preview at 1379, Claude Opus 4.5 at 1342 and GLM 4.7 at 1337, with the rest clustered between roughly 1268 and 1301.

Design Arena is interesting because it’s explicitly human preference-driven. Here’s how it works:

  • Users come to the platform to explore and use the best AI-powered tools, like website generation and game generation
  • Design Arena presents multiple versions of the same experience (a website, agent, or builder), and users can save their favorite
  • Rankings emerge from these aggregated choices across categories like website generation, agents, and builders, reflecting real usage preferences rather than curated rubrics
  • Elo-style scores are calculated using a Bradley-Terry model, with models below a minimum comparison threshold filtered out.
  • The leaderboard updates live (every three hours, per their methodology), powered by interactions from over 850,000 users across 145 countries.

Slide labelled 'DESIGN ARENA' showing a head-to-head comparison in the arena interface. A prompt box at the top reads 'make a website for lofi beats girl'. Underneath, two anonymous model outputs sit side by side: the left is a dark purple-toned music site headlined 'Midnight clouds & vinyl whispers' with a player panel, a Featured Beats grid and sections for daily rituals and a mood palette; the right is a dark blue 'Lofi Beats Girl' site with a teal hero band reading 'Chill Vibes & Relaxing Tunes', a circular photo, a Featured Tracks grid of album cards and a Curated Playlists row. At the bottom are voting buttons 'I prefer left' and 'I prefer right'.

By using a pairwise comparison system, DesignArena generates leaderboards that rank AI models based on human preferences, helping to measure and drive improvements in design quality, usability, and aesthetics.

Similarly, Web Dev Arena is an open-source benchmarking platform from LMArena designed to evaluate LLMs based on their capability to build functional, interactive web applications. Users submit a prompt and compare anonymous AI models generating code side-by-side, contributing to a community-driven Elo leaderboard that ranks top models for complex web development tasks.

Screenshot of the 'WebDev Leaderboard' on lmarena.ai, described as comparing the performance of AI models on web development tasks built in the Code Arena. Header stats show Last Updated Dec 23, 2025, Total Votes 75,257 and Total Models 32, with tabs for Overview, Text, WebDev, Vision, Text-to-Image, Image Edit, Search, Text-to-Video and Image-to-Video. The ranked table lists claude-opus-4-5-20251101-thinking-32k at 1520 with 4,088 votes from Anthropic, gpt-5.2-high at 1484, claude-opus-4-5-20251101 at 1480, gemini-3-pro at 1478 with 9,066 votes from Google, gemini-3-flash at 1465, gpt-5-medium at 1398, gpt-5.2 at 1398 and claude-sonnet-4-5-20250929-thinking-32k at 1393, with columns for rank spread, 95% confidence interval, votes, organization and license.

So what do React developers learn from such arenas?

The Core Finding: AI has mastered logic, but not taste

Slide titled 'DESIGN ARENA'S CORE FINDING'. White text reads 'Models that ace bar exams and win math olympiads still generate simple UIs' and yellow text adds 'The aesthetic gap is real and measurable.' On the right are two screenshots of arena comparison cards. The top one shows an input prompt asking for a personal website that is professional and colourful, with side-by-side outputs from Claude 3.7 Sonnet and Grok 4 Fast showing pastel purple personal-profile pages. The bottom one shows a UI Component prompt asking for a simple, modern interface to set personal preferences, with outputs from Claude Haiku 4.5 and Claude Sonnet 4 rendering settings panels with rows of toggle switches.

This slide is the thesis of the whole talk. Models can solve hard reasoning problems and still produce UIs with basic design failures: off color choices, inconsistent spacing, weak hierarchy.

I call this the capability divide:

  • AI is strong at logic, data flow, and implementing explicit requirements
  • AI is weak at taste, usability awareness, and aesthetic judgment

If you’re a React developer, this should change how you delegate:

  • Delegate boilerplate and mechanical implementation
  • Keep design intent, API design, and architecture decisions human-led
  • Treat “pretty” as an explicit requirement, not a default outcome

The Surprise: Tools and scaffolding matter more than you think

Design Arena also found something counterintuitive: general agents are more variable than specialists, and the scaffolding and workflow around the base model drives a lot of the performance spread.

Put differently: two products can wrap the same base model and feel wildly different because of tooling, retrieval, iteration loops, and guardrails.

This is great news, because it means you have leverage even when you don’t control the base model.


Arena by Arena: What React developers should steal from the data

Plain black slide with large white and yellow condensed capitals reading 'WHAT CAN REACT DEVELOPERS LEARN FROM DESIGN ARENA?', where 'DESIGN ARENA' is in yellow.

Let me walk through five arenas and extract the practical lessons for each one.

1. Website Arena: Prompt to website (and why Purple keeps happening)

The Website Arena measures how well models generate complete single-page sites from a prompt, with instructions to add modern UI/UX practices, accessibility, and responsive design.

Slide headed 'DESIGN ARENA'S WEBSITE ARENA', with the small yellow kicker 'DESIGN ARENA'S' above the white title. Under the yellow subhead 'THE BIG PICTURE', the text reads 'Measures how well models generate complete, single-page websites from a prompt. Models are instructed to add modern UI/UX practices, accessibility, and responsive design', with those last phrases highlighted in yellow. On the right is a WebDev leaderboard panel listing claude-opus-4-5-20251101-thi... at 1522, gpt-5.2-high at 1484, claude-opus-4-5-20251101 at 1480, gemini-3-pro at 1479, gemini-3-flash at 1470, glm-4.7 at 1449, gpt-5-medium at 1398 and gpt-5.2 at 1398.

The important nuance is how winners tend to win: it’s not always the flashiest layout, it’s often the most coherent and complete page.

If your goal is something shippable, bias your prompts toward coherence and structure, not ‘make it look cool.

Why is there so much purple?

I joked about this in the talk because once you see it, you can’t unsee it: models converge on safe, generic design patterns, and “purple gradient plus glassmorphism” is one of those defaults.

Plain black slide with large condensed capitals reading 'WHY IS THERE SO MUCH PURPLE IN AI-GENERATED DESIGNS?', with the word 'PURPLE' set in light purple and the rest in white.

That’s not just a meme. It’s distributional convergence: under uncertainty, models gravitate toward common patterns in the data.

How do you fix it?

Before-and-after comparison slide. On the left, black text on white reads 'Fix the purple LLM-slop design aesthetic with good prompting + Claude Skills', with the URL https://claude.com/blog/improving-frontend-design-through-skills printed underneath. On the right, a two-column grid labelled 'Before' and 'After' shows three pairs of page mockups: a purple-accented blog layout versus a cream editorial page headlined 'The Art of Quiet Computing'; a light purple SaaS landing page headlined 'Manage Projects Smarter & Faster' versus a dark 'Momentum' page reading 'Project management without the chaos'; and a purple-tinted user management table versus a dark green terminal-style dashboard labelled 'USER.CTRL' with large numeric stats.

One approach is tooling rather than “better prompts forever.” Anthropic pushed some of this into Skills (markdown files that Claude reads on demand) instead of trying to brute force it through training. Their frontend-design skill is worth checking out.

Even if you never use Claude Skills specifically, the lesson is broader:

  • Some failures are better solved by scaffolding and constraints than by model selection
  • You want repeatable, shareable “taste primitives” that don’t require rewriting your entire prompt every time

My website generation checklist for React teams

What I ask for up front:

  • Anchor the layout first: Specify the page sections you want before code
  • Specify stack and routing: Call out Next App Router, file names, and RSC vs client components so it doesn’t invent structure
  • Describe content density: Minimal landing page vs long-form so spacing doesn’t default to sludge
  • Ask for responsive constraints: Breakpoints and collapse behavior
  • Bake in accessibility: Semantic landmarks, skip links, labels, safe contrast
  • Convert HTML to real React files: Map sections to components and wire them up in page.tsx

What I do after generation, before trusting it:

  • Strip inline scripts and move DOM logic into client components with hooks and typed props
  • Normalize layout primitives and refactor div soup into your real Shell, Container, Stack components
  • Run a11y and perf checks: Lint, Lighthouse, and add tests for critical flows
  • Freeze the visual system: Snap palette, spacing, typography into Tailwind config or tokens
  • Keep the model on a leash: Use it for slices and variants, not wholesale rewrites of a tuned page

Single sentence summary: Be radically explicit in your instructions, and enforce your design system and coding standards so the model can’t drift.

Poor prompt:

Make a landing page for a SaaS product

Strong prompt:

Create a Next.js App Router landing page (app/page.tsx) for a developer tools SaaS:

Layout sections:
1. Hero with headline, subheadline, CTA
2. Features (3 columns, icon + title + description each)
3. Social proof (logos grid)
4. CTA

Stack: Next.js 15, TypeScript, Tailwind
Density: Spacious landing page (not cramped)
Colors: Avoid purple/pink gradients - use neutral gray with blue accent
Responsive: Stack features vertically below 768px

Accessibility:
- Semantic HTML (header, main, section)
- Alt text for all images
- Sufficient color contrast (WCAG AA)

2. Agent Arena: Most failures are context failures now

The Agent Arena is a step up: multi-step tasks like writing code, fixing bugs, running tests, running browsers, debugging. This is where “agent loops” show up.

Slide headed 'DESIGN ARENA'S AGENT ARENA'. Under the yellow subhead 'AUTONOMOUS CODERS', the text reads 'Ranks autonomous agents on their ability to execute multi-step tasks like writing code, fixing bugs, and building full-stack applications.' On the right is a leaderboard panel last updated November 18, 2025 at 8:15 AM EST, ranking by Elo rating: number one Factory AI (GPT-5-Codex) at 1329, number two GPT-5-Codex at 1305, number three Devin AI at 1262, number four Claude Code (Sonnet 4.5) at 1239, number five Cursor Agent (GPT-5) at 1119, and number six Gemini CLI (Gemini 2.5 Pro) at 935, each with win and loss counts beneath the rating.

Here’s the biggest trap: when agents fail, it often looks like “the model is dumb.” Increasingly, that’s not true.

Plain black slide with large condensed capitals reading 'MOST AGENT FAILURES ARE NOT MODEL FAILURES ANYMORE, THEY ARE CONTEXT FAILURES.', with the closing phrase 'CONTEXT FAILURES' in yellow and the rest in white.

Most agent failures are context failures. If the agent doesn’t see the right logs, tests, or constraints, it makes confident but wrong changes. Fixing context is often higher leverage than switching models.

I also called out something that will resonate if you’ve ever spent time tweaking prompts: prompt engineering failures often come from context mismanagement, not “the wrong magic words.”

How I run agents like a React team lead

Treat agents like a junior hire:

  • Give a written task brief, acceptance criteria, and constraints
  • Declare the sandbox: disposable branch, test DB, temporary env vars
  • Ask for a plan first: files it will touch, tools it will call, risks it sees
  • Cap blast radius: constrain write access to app, src, config
  • Require tests as part of fixes: reproduce bug first, then patch
  • Force small PRs: reviewable commits, not a mega diff

Then add operational guardrails:

  • Point them at logs and monitors: build logs, Sentry traces, Playwright failures
  • Snap to house style: ESLint config, prettier rules, naming conventions
  • Disable auto-merge and require human approval for agent changes

That’s the difference between “agentic coding” and “outsourcing your codebase to a stochastic parrot.”

Poor prompt:

Fix the bug in the checkout flow

Strong prompt:

Task: Fix abandoned cart bug in checkout

Context:
- File: app/checkout/page.tsx
- Error: Cart resets on page refresh
- Expected: Cart persists via localStorage
- Test: Run `npm test checkout.test.tsx` to verify

Plan required before implementation:
1. Identify where cart state is managed
2. Add localStorage persistence
3. Add hydration logic
4. Update tests
5. Verify in Playwright

Constraints:
- Only modify app/checkout/* and lib/cart.ts
- Maintain existing TypeScript types
- Follow our ESLint rules

3. Context Engineering: The highest leverage skill for agentic React

If context is the bottleneck, then context engineering is the discipline.

Hand-drawn style Venn diagram on a white background, captioned 'Everything is Context Engineering!' in the top left corner. A large blue ellipse labelled 'Context Engineering' encloses several overlapping translucent circles: a purple circle labelled 'RAG', a yellow circle labelled 'Prompt Engineering', a pink circle labelled 'State / History', a green circle labelled 'Memory', and a beige circle labelled 'Structured Outputs' that sits mostly outside the blue ellipse at the lower left. A credit line at the bottom right reads 'Based on illustration by dexhorthy'.

In the talk I described context engineering as the art and science of filling the context window with just the right information to guide the agent’s performance. It’s more than clever prompting.

Two specific tips I want most React developers to internalize:

  1. Visual context is powerful. Screenshots can enable one-shot solutions for UI bugs or design tasks.
  2. Structure beats volume. Unstructured dumps confuse the model, competing information distracts it, and overload overwhelms it.

Under the hood, this ties back to a core principle: “Find the smallest possible set of high-signal tokens that maximize the likelihood of your desired outcome.”

Every token you waste is context you cannot spend on:

  • The actual API surface you need
  • The architectural constraints you care about
  • The failing test output that would prevent a bad patch

4. Tooling: If you can’t control the base model, control the layer around It

As I said in the “mastering the tools” section: you probably don’t control the base model, but you can absolutely steer the tooling around it.

Slide with a small grey kicker reading 'QUICK TIP' above large white capitals asking 'HOW DO YOU GET THE MOST OUT OF AI CODING AGENTS WITH REACT TODAY?', with the word 'TODAY' in yellow, all on a black background.

A concrete example is doc and state retrieval. Let me show you two tools that demonstrate this pattern:

Context7 MCP

Split slide. The left half is white with heavy black capitals reading 'CONTEXT7 MCP. LIBRARY AND API TRUTH' and a grey subtitle 'Pulls fresh, version-specific docs and examples straight from source sites'. The right half is a dark screenshot of an MCP marketplace listing for Context7 by upstash, with an Install button, 36,255 stars and 90,825 downloads, and the description 'Provides up-to-date library documentation and code examples directly in LLM prompts, ensuring accurate and current programming assistance.' Tags read developer-tools, documentation, code-examples and api-reference. Below is a 'Submit MCP Server' card inviting people to submit an issue to github.com/cline/mcp-marketplace.

Context7 pulls fresh, version-specific docs and examples from source sites and injects them into the model’s working set, reducing guessing and stale snippets. You can nudge it toward topics like routing or hooks and cap how much to bring in.

Next.js DevTools MCP

Split slide. The left half is white with heavy black capitals reading 'NEXT.JS DEVTOOLS MCP. YOUR APP'S LIVE STATE AND STRUCTURE' and a grey subtitle 'Pulls fresh, version-specific docs and examples straight from source sites'. The right half is a dark code editor screenshot of a cline_mcp_settings.json file containing a mcpServers object with a next-devtools entry whose command is npx and whose args are ['-y', 'next-devtools-mcp@latest'], with editor tabs for package.json and a terminal panel showing Output, Terminal, Ports and Problems tabs.

The modern Next dev server exposes a built-in MCP endpoint. The Next.js DevTools MCP server connects to it so an agent can ask for real data about your running app:

  • Current build or runtime errors
  • Routes and layouts
  • Component metadata
  • Server actions and dev logs
  • Playwright paths for simple browser checks

It also ships with a Next-specific knowledge base and helpers for common tasks like upgrades.

Chrome DevTools MCP

Split slide. The left half is white with heavy black capitals reading 'CHROME DEVTOOLS MCP. WHAT ACTUALLY HAPPENS IN THE BROWSER' and a grey subtitle 'Gives the agent eyes and hands in Chrome'. The right half is a dark screenshot of a Chrome DevTools MCP extension listing page with the Chrome logo, publisher ChromeDevTools, about 1K stars, a green Install button with a large red arrow pointing at it, Details and Manifest tabs, an npm version badge reading v0.6.0, and body text explaining that chrome-devtools-mcp lets a coding agent such as Gemini or Claude drive a live Chrome browser as a Model-Context-Protocol server, with a 'Key features' section beginning 'Get performance insights: Uses Chrome DevTools to record...'.

Chrome DevTools MCP gives the agent eyes and hands in a real browser. It can open pages, click through flows, read console and network logs, take screenshots, and record performance traces to investigate things like high LCP or blocking time. Under the hood it rides on Chrome DevTools and Puppeteer, so you get reliable automation instead of brittle scripts. Because it can see page content, you still want sensible flags and isolation from personal browsing, but treated as scoped tooling it is very powerful.

How MCPs fit together

Slide titled 'HOW MCPS FIT TOGETHER TO BUILD HIGHER-QUALITY APPS' with four yellow step labels down the left and explanatory paragraphs beside each. PLAN: ask the assistant to outline a fix or feature and declare what context it intends to fetch; this is where Context7 resolves library names and pulls the right pages for the exact versions you use. CODE: implement with app awareness, letting Next DevTools MCP report build errors, affected routes and where in your tree the change belongs, then generate code matching your project's patterns. VERIFY: verify in a real browser, having the agent run the app and reproduce the flow in Chrome via Chrome DevTools MCP to test layout or performance, citing failing requests, console errors and layout shifts before proposing fixes. ITERATE: rinse and repeat until the browser check passes and Next's runtime is clean, the loop-closing step that reduces hallucinations and 'looks right but breaks at runtime' issues.

Context7 gives your assistant the right external knowledge. Next DevTools MCP gives it your app’s truth. Chrome DevTools MCP proves the result in a real browser. Used together, you turn a guessing assistant into a closed-loop coder and debugger that cites sources, places changes correctly, and verifies outcomes before you hit commit.

This is the pattern I expect more React teams to adopt: rather than hoping the model remembers today’s Next.js behavior, wire it to an always-correct source of truth.


5. Builder Arena: Vibe Coding tools used responsibly

Builder tools are designed for rapid prompt-driven product creation, not just “write me a component.” They optimize for cohesion and perceived completeness.

Slide headed 'DESIGN ARENA'S BUILDER ARENA'. Under the yellow subhead 'THE VIBE-CODING TEST', the text reads 'Pits specialized UI builder tools (and their underlying models) against each other. It focuses on how well they convert a prompt into a functioning, aesthetically pleasing product.' On the right is a leaderboard panel headed 'The Leaderboard', last updated November 7, 2025 at 4:53 PM PST, with a Filter control and a ranked list: number one Flames.blue, number two Orchids V2, number three Magic Patterns, number four Floot, number five new.website, number six Lovable and number seven Anything.

Design Arena’s builder results were surprising precisely because builders are not just base models. They’re base models plus scaffolding plus UX and post-processing.

Slide titled 'A DEVX DASHBOARD' at the top and 'EVALUATE VIBE-CODING BUILDERS' in yellow at the bottom. Between them is an arena comparison strip. On the left, an input prompt asks for a developer experience dashboard with insights into overall DevEx score and trend, team motivation, wasted time and the most critical friction facing the organisation and teams, with team-level comparison. To the right are three ranked builder outputs: Google AI Studio (1st) showing an overall DevEx score of 82 out of 100, team motivation 8.5 out of 10 and wasted time per month of 400 hours; Orchids V2 (2nd) showing a DevEx Overview card with a score of 68 and a benchmark comparison bar chart at 72%; and Bolt.new (3rd) showing a DevEx score of 7.6, team motivation 7.9 and weekly wasted time of 45h.

My guidance for React developers:

  • Use builders as idea generators. Harvest layout, copy, micro-interactions, then rebuild cleanly in your codebase
  • Normalize APIs. Refactor generated fetch calls, hooks, stores to your patterns
  • Consolidate CSS. Pull scattered styles into tokens and your component library to avoid spawning a second design system
  • Archive failure cases. Save screenshots and diffs to refine prompts and tool settings over time

And if you want the “before you even start” checklist:

  • Start with a written product spec: features, user types, flows
  • Lock your design system: your existing shadcn, Radix, or in-house primitives
  • Describe the vibe in concrete terms: reference sites, adjectives, motion levels
  • Limit surface area: use builders for a single flow rather than your entire shell

If you treat builder output as production code by default, you’ll end up maintaining a foreign codebase you never chose.


6. UI Components Arena: where React developers win

The UI Components Arena is the most directly applicable to most React teams: generate isolated reusable components. Scope is focused, success rate is high, and output can be close to production-ready.

Slide headed 'DESIGN ARENA'S UI COMPONENTS ARENA'. Under the yellow subhead 'PERFECT FOR REACT', the text reads 'Models generate self-contained components with HTML, CSS, and JS. This is ideal for React development, where you can easily wrap this output. System prompts encourage production-ready code using libraries like Tailwind and Heroicons.' On the right is a leaderboard last updated November 18, 2025 at 7:17 AM EST ranking by Elo rating: Gemini 3 Pro Preview 1500, GPT-5.1 (None) 1387, AesCoder-4B 1360, Claude Sonnet 4.5 1357, GPT-5 (High) 1338, Claude Opus 4.1 1319, GLM 4.6 1315 and Kimi K2 Thinking 1296, each with win and loss counts.

Slide titled 'CREATE A STOCK MARKET COMPONENT' with the caption 'EVALUATE UI COMPONENT QUALITY' in yellow at the bottom. The large left panel shows a first-place output from GPT-5 nano (Default): a dark 'StockViz' real-time stock visualizer with a ticker selector for AAPL - Apple, 1D/1W/1M range buttons, Pause and Theme controls, a green intraday line chart, and a stats row reading Current Price 177.67, Volume (24h) 260.6K, Market Cap $60103.20 B and 52W Range 171.84 - 186.91. Smaller thumbnails to the right show second-place Claude Haiku 4.5 with a pale 'Stock Market Visualizer' and smooth area chart, third-place Grok 4 Fast with a denser candlestick-style dashboard, and fourth-place Gemini 2.5 Pro with a purple-tinted card showing $1,037.99 and a small chart.

It’s also where the “logic not taste” lesson shows up cleanly: models can wire up props and state and still make ugly, inconsistent decisions.

Text-only slide on black in large condensed capitals reading 'AI HAS MASTERED LOGIC BUT NOT TASTE. MODELS SOLVING COMPLEX REASONING TASKS STILL PRODUCE UIS WITH BASIC DESIGN FAILURES - POOR COLOR CHOICES, INCONSISTENT SPACING, NO VISUAL HIERARCHY.' The words 'LOGIC', 'TASTE' and 'BASIC DESIGN FAILURES' are highlighted in yellow.

So I use AI here heavily, but with a specific protocol.

Start by forcing a Component contract

These are the things I want in the prompt before the model writes JSX:

  • Define prop names, types, variants, and states
  • Provide examples and edge cases, including weird inputs
  • Demand accessibility by default: keyboard nav, ARIA, focus management, error messaging
  • Avoid anonymous div wrappers; use semantic structure where it matters
  • Separate styling concerns: Tailwind classes or your utility system, not inline styles
  • Request story files: Storybook or MDX usage examples

Then do the React integration work AI is usually bad at

Once you have a plausible component, integrate it like a senior engineer:

  • Convert state to idiomatic React: Replace query selectors and global variables with hooks and props
  • Make behavior composable: Refactor complex pieces into hooks you own
  • Test the contract, not the implementation: Focus tests on props and events so internals can evolve
  • Snap components into your design system before exposing them broadly

This is the pattern I recommend to teams: let AI get you 70% of the way on structure, then deliberately take ownership of API shape, composition, and design tokens.

Poor prompt:

Create a sign-up button component with different variants

Strong prompt:

Create a sign-up Button component with:

Props:
- variant: 'primary' | 'secondary' | 'ghost'
- size: 'sm' | 'md' | 'lg'
- disabled: boolean
- loading: boolean

Requirements:
- Use Tailwind classes
- Show loading spinner when loading=true
- Disable pointer events when disabled
- Support keyboard navigation (Enter/Space)
- Include focus-visible ring
- ARIA: use aria-disabled, aria-busy

Example usage:
<Button variant="primary" size="md" loading={isSubmitting}>
  Submit
</Button>

Then show a side-by-side of what each produces - the poor one generates inconsistent spacing, misses accessibility, uses inline styles. The strong one hits all requirements.


7. 3D and Data Viz: Let AI generate assets and data, not your entire integration

The 3D and Data Viz arenas stress more structured generation tasks, relevant for interactive dashboards, WebGL, and data-heavy apps.

Slide titled '3D & DATA VIZ ARENAS'. Under the yellow subhead 'BEYOND PAGES', the text reads 'This arena tests models on more complex design tasks: generating 3D models and data visualizations. This is critical for developers working on interactive dashboards, WebGL experiences, or scientific applications.' On the right is a '3D Design Arena' model performance bar chart with an Elo rating axis: Gemini 3 Pro Preview leads at 1468, followed by GLM 4.5 at 1331, Claude Sonnet 4 at 1323, Claude Opus 4.1 at 1322, Claude Opus 4.1 (Thinking) at 1317, Claude Opus 4 at 1310 and Claude Sonnet 4.5 (Thinking) at 1300.

Slide titled 'A 3D RED CAR BY A HOTEL' with 'EVALUATE 3D DESIGN QUALITY' in yellow at the bottom. The large left panel, labelled 'GEMINI 3.0', shows a dark night-time 3D scene of a tall building with glowing yellow windows, street lamps along a road, and a small red car parked outside, with an overlay card reading 'GRAND HOTEL & ROADSTER, Interactive 3D Scene, Left Click: Rotate Camera, Right Click: Pan, Scroll: Zoom'. Smaller thumbnails on the right show competing outputs: a bright daytime scene from Claude Sonnet 4.5 (Thinking) in second place with a blocky hotel, road and trees, and lower-ranked flat or nearly empty scenes from Magistral Small 1.2 (2508) and GPT-5.1 (Medium).

The lesson from these arenas is not “AI writes your Three.js app.” It’s:

  • Decide what AI should generate: Ask for geometries, datasets, configuration, not full integration code
  • Specify the target library: React Three Fiber, Drei, Recharts, Victory, Visx
  • Request low poly first and iterate toward fidelity once performance is proven
  • Keep performance under control: Lazy load heavy assets, guard frame rate, keep fallbacks

In practice, this is how you avoid an “AI demo” becoming a performance incident.


React-Specific tips I want more teams to operationalize

The talk includes a slide of “React AI coding tips” that I keep coming back to because it captures what actually works in practice.

Slide titled 'REACT AI CODING TIPS' listing ten tips in two columns, each with a yellow lead-in. Ask for a plan, then generate in steps, since small reviewable increments beat one big shot and help avoid the complexity cliff. Codify taste so AI can follow it, locking spacing, colors and components in Tailwind config and a design system like shadcn. Be specific about third-party libraries you prefer, for example having AI generate data or assets and render with React Three Fiber and Recharts. Be explicit about routes, layouts, server actions, loading and error boundaries. Bake conventions into the repo, documenting App Router defaults, Server Components and Suspense. Start every prompt with the component API, declaring props, variants and states up front. Name the interactive states you expect, such as hover, focus, loading and disabled. Run checks only on what changed, using Husky with lint-staged. Control cache behavior explicitly with fetch cache options and revalidate windows. Sandbox agents, letting them scaffold or fix in a container or separate branch and reviewing every diff like you would from a junior.

Here are the ones I see paying off immediately on real teams:

  • Start prompts with the component API: Declare props, variants, states, and then tell the model to implement exactly that
  • Name interactive states explicitly: hover, focus, loading, disabled
  • Ask for a plan, then generate in steps: Small increments beat one big shot, and help avoid the complexity cliff
  • Codify taste so AI can follow it: Lock spacing, colors, components in Tailwind config and your design system
  • Be explicit about routes, layouts, server actions, loading and error boundaries
  • Bake conventions into the repo: Document App Router defaults, Server Components, Suspense so assistants align automatically
  • Run checks only on what changed: Husky with lint-staged to run typecheck, lint, tests on staged files
  • Control cache behavior explicitly: Fetch cache options and revalidation windows as part of the prompt, so the model doesn’t guess your policy

The meta-message is the same: The difference between “AI helped me ship” and “AI gave me a mess” is almost always the level of specificity and the strength of your guardrails.


How I debug AI coding failures: it’s a pipeline, not a model

Once you accept the complexity cliff, the question becomes: how do you consistently get good outcomes?

I use a mental model I showed near the end of the talk: when AI code works or fails, it’s rarely “just the model.” It’s the whole pipeline.

Slide titled 'WHY AI CODE WORKS OR FAILS' with the yellow line 'It's not just the model. There's a pipeline:' followed by a numbered white list: 1. Base LLM model ('the brain'), 2. System prompt & instructions, 3. Your user prompt, 4. Fine-tuning & code training, 5. Tools & retrieval (RAG), 6. Agent loops (iteration), 7. Post-processing.

The pipeline:

  1. Base model
  2. System prompt and instructions
  3. Your user prompt
  4. Fine-tuning and code training
  5. Tools and retrieval (RAG)
  6. Agent loops (iteration)
  7. Post-processing

If you’re disappointed, you can almost always point to a weak link: wrong model for task, vague prompt, missing context, no iteration.

When things work, it’s usually because multiple layers aligned well: strong model, good prompt, necessary context, and iteration to iron out kinks.

This is actionable, because most of those layers are under your control as a user, even if you don’t own the base model.


The workflow I recommend for agentic React coding

I summarized it in the deck as the “new flow state”:

Text-only slide on black in large condensed capitals reading 'WHEN AI CODE WORKS BEAUTIFULLY, IT'S USUALLY BECAUSE THE MODEL WAS STRONG AND YOU GAVE IT A GOOD PROMPT AND IT HAD THE NECESSARY CONTEXT AND MAYBE AN ITERATIVE PROCESS IRONED OUT KINKS', with 'the model was strong' in yellow, 'good prompt' in green and 'necessary context' in blue.

  1. Define clear requirements (maybe write tests)
  2. Prompt with context (stack, docs, examples)
  3. Ask for plan, review
  4. Generate code in small steps
  5. Run, test, refine
  6. Iterate until production-ready

This sounds like “normal engineering,” and that’s the point. The best teams I see using AI are not doing anything mystical. They’re turning implicit engineering discipline into explicit instructions and then using AI to accelerate the boring parts.

If you want one sentence: You’re not just typing code anymore, you’re orchestrating code creation.


So, how good is AI at coding React, really?

Where I land after looking at these benchmarks and using these tools day to day:

AI is genuinely strong at:

  • Isolated React components
  • Scaffolding
  • Converting clearly specified requirements into working code

⚠️ AI is still unreliable at:

  • Multi-step integration tasks without strong tooling, strong context, and iteration loops

AI is consistently weaker at:

  • Taste, hierarchy, and nuanced UX decisions than it is at “code that runs”
  • The aesthetic gap is real

💡 The highest leverage strategy is not “pick the best model.” It’s:

  • Reduce context failures
  • Codify your conventions
  • Force stepwise work

And the part I find most exciting: The opportunity keeps expanding. Models and tools change fast, but the underlying skills that make you effective don’t. You are still the architect.


Learn More

If you want to keep exploring this space:

And if you want to dive deeper into related topics, I’ve written two books on the topic: “Beyond Vibe Coding” and “Building large-scale web apps with React