Why We Switched from React to HTMX in Production: A 200-Site Case Study After running a React SPA admin panel for three years, a team migrated over 200 production deployments to HTMX over six months, finding that React's complexity was unnecessary for their primarily CRUD-based workload of forms, lists, and modals. The HTMX version required significantly less code—for example, an "edit article" screen dropped from 1,400 lines across 9 React files to 180 lines of HTML with a thin PHP controller—and eliminated bundle size, build times, and hydration overhead. The migration succeeded by running both stacks in parallel route-by-route, avoiding a big-bang rewrite, and leveraging three core HTMX patterns (forms, infinite scroll, and server-rendered modals) that covered 80% of the codebase. We ran a React SPA admin panel for almost three years. It worked. Customers logged in, edited content, published articles. Bundle size kept creeping up. Build times kept creeping up. A new dev needed two weeks to be productive. We started skipping minor features because "the diff is too risky." In Q3 2025 we migrated that panel to HTMX over six months, route by route. This post is the honest version of how it went — what worked, what we didn't see coming, and the numbers from running both stacks side by side across more than 200 production deployments. Let me get one thing out of the way: React isn't broken. It's a fine tool for the workloads it was designed for. Our admin panel was not one of those workloads. Most of our screens are forms, lists, and modal dialogs. The fanciest interaction is drag-to-reorder. The actual user count per tenant is small — usually 1 to 5 editors per site. For that, here's what React was costing us: None of these are dealbreakers in isolation. Stacked together, they made every small change expensive. We were paying SPA prices for a CRUD app. The pitch is one line: HTMX lets any element issue an AJAX request and swap the response into the DOM. There's no client-side router, no virtual DOM, no build step required. You render HTML on the server we use Smarty 5 , the browser swaps fragments, the network does the heavy lifting. What sold us wasn't the elegance of the demo. It was a 40-minute spike where one engineer rebuilt our "edit article" screen — form, validation, autosave, image upload — in 180 lines of HTML + a thin PHP controller. The React version was 1,400 lines across 9 files. The interesting part: the HTMX version felt faster, and was. No JS bundle to parse, no hydration step. The TTI was essentially the same as the LCP because there was nothing to hydrate. We've been burned by big-bang rewrites before. This time we did parallel routes: /admin/old/ keep serving React. New routes /admin/ serve server-rendered HTML with HTMX.The "no big bang" rule matters. If we'd tried to ship the whole panel in one PR, we wouldn't have shipped at all. Most of the panel is built from three patterns. If you understand these, you understand 80% of an HTMX codebase.