All posts

Remix 3 Beta Drops React: What It Means for Teams Shipping Web Apps

Remix 3 beta landed on April 30, 2026 — and the headline is hard to miss: the framework no longer ships React. Here's what actually changed, what it means in practice, and how to think about it for production work.

Remix 3 Beta Drops React: What It Means for Teams Shipping Web Apps

On April 30, 2026, the Remix team published a beta preview of Remix 3. The release itself is a beta — not production-ready, by Remix's own framing — but the architectural changes are the news. Remix 3 is no longer a React framework. The model is rebuilt around the Fetch API, plain JavaScript, and a full-stack package rather than a routing-and-rendering layer with everything else left to you.

For any team currently running a Remix v2 codebase, or weighing a meta-framework for a new project, the next few months matter. There are now two distinct paths forward, and they are not interchangeable.

The two paths the Remix team has shipped

The most important thing to internalize before reading any further: Remix v2's roadmap and the Remix 3 brand are not the same product.

The Remix team merged Remix v2's loader/action/route model into React Router v7 in 2024. That is the stable, React-based, production-ready continuation of what Remix v2 users were already running. It is essentially Remix v2 inside the React Router package.

Remix 3 is the new thing. It is a ground-up rewrite that drops React in favor of a smaller, web-standards-first runtime — built on a fork of Preact, with an explicit, imperative component model. There is no automated migration path from Remix v2 to Remix 3. If you were on Remix v2 and you want continuity, you upgrade to React Router v7. If you want Remix 3, you start a new app.

LogRocket's breakdown of the split puts it cleanly: same brand, two different products, picked by what you value more — ecosystem continuity or the new model.

What changed in the runtime

Remix 3's blog post is explicit about the design goals. Three are worth understanding before you decide whether the framework is worth a prototype.

Routes are Fetch API routes

Controllers return standard Response objects. Middleware owns the request lifecycle. Forms submit to URLs. Sessions, auth, and data share context through ordinary request handlers. None of this is exotic — it's what server-side web programming has looked like for decades — but it makes the framework's surface area noticeably smaller. There is no parallel RPC layer to learn alongside the HTTP layer.

Components are plain JavaScript with explicit updates

The Remix 3 component model leaves React's declarative re-rendering behind. State lives in normal closure variables. When you want a re-render, you call an update() method on a handle the component receives. There are no hooks, no rules-of-hooks, no dependency arrays.

A sketch of the prototype model, from the official beta post:

import { type Handle, on } from "remix/ui";
import * as btn from "remix/ui/button";

function CopyToClipboard(handle: Handle<{ url: string }>) {
  let state: "idle" | "copied" | "error" = "idle";

  return () => (
    <button
      aria-live="polite"
      mix={[
        btn.secondaryStyle,
        on("click", async (_, signal) => {
          try {
            await navigator.clipboard.writeText(handle.props.url);
            if (signal.aborted) return;
            state = "copied";
            handle.update();
            setTimeout(() => {
              if (signal.aborted) return;
              state = "idle";
              handle.update();
            }, 2000);
          } catch {
            state = "error";
            handle.update();
          }
        }),
      ]}
    >
      {state === "copied" ? "Copied" : "Copy"}
    </button>
  );
}

If you have spent years writing React, what is not there is the first thing you notice: no useState, no useEffect, no dependency-array footguns. The AbortSignal threaded through the click handler is the second — async work is cancellable by default, which removes a category of bugs that hooks rarely make pleasant.

It's a different model. Whether it is a better model depends on your team. Imperative state with explicit updates is easier to read in isolation; large declarative trees with derived state are easier to refactor at scale. Both claims are true.

"Unbundling" — the runtime is the source of truth

The blog post calls Remix 3's asset approach unbundling. The framework still compiles and serves assets, but the application's mental model does not require a bundler analysis pass to make sense. There are no special semantics around import statements. Routes are files. Handlers return responses. The system you debug at runtime is the system you wrote.

That has practical implications. Build-time magic is the thing that ages worst in framework code — it's what makes upgrading painful, what makes server/client boundaries confusing, and what makes onboarding new developers a documentation slog. A runtime-first framework trades some build-time optimization for a smaller mental model.

Frames: server-rendered fragments with URLs

The most concretely useful new primitive is the frame. A frame is server-rendered UI with a src attribute. The client can load it, navigate it, or reload it without involving the rest of the page. The server keeps owning the HTML; the client just composes fragments.

If you have looked at HTMX in the last two years, the shape is familiar. Frames are not htmx — they are tighter to the framework — but they sit in the same philosophical neighborhood: let the server own markup, let URLs identify state, and stop reinventing HTTP in JavaScript.

How to think about it for production work

The Remix team explicitly says the beta is for "experiments, demos, prototypes, and feedback." That guidance is correct. The framework will move quickly between beta and a stable release, the public API will keep changing, and the ecosystem around it is small to nonexistent. None of that is a problem for a side project. All of it is a problem for a customer-facing application that needs to ship this quarter.

Here is how we'd frame the decision matrix for a tech lead today.

If you're on Remix v2 in production. Plan your upgrade to React Router v7. That is the supported, React-based continuation of the model you already use. Don't let the Remix 3 announcement push you toward a rewrite — they are not the same product, and React Router v7 is where your existing loaders and actions actually live now.

If you're starting a new app today. Pick based on the team's center of gravity. A React team building a typical SaaS app should still pick something React-native — React Router v7, Next.js, or TanStack Start. A small team that values minimal dependencies and is willing to bet on a still-moving target can use Remix 3 for an internal tool or greenfield project and learn the model honestly.

If you're evaluating frameworks for a longer planning horizon. Spend a day with the beta. Build something small. The model rewards a hands-on hour more than any think piece will. Ask whether the imperative component pattern and the unbundled runtime feel like leverage or like work — for your team specifically.

The bigger trend Remix 3 is part of

Remix 3 doesn't exist in a vacuum. The 2026 framework conversation is increasingly about pulling back from build-time complexity and standing closer to the platform. Vue's Vapor Mode bypasses the virtual DOM at compile time. SolidJS has made the same argument for years. HTMX's quiet rise is the same instinct expressed differently — let URLs be the API.

Remix 3 makes its bet loudly: no virtual-DOM library you don't control, a small set of primitives that match the web's, and a framework you can hold in your head. The framework that ships eventually will look different from today's beta. What's worth tracking now is the direction.

Takeaways

The five things worth carrying into Monday's standup:

  1. Remix v2 users upgrade to React Router v7. That's the supported continuation. Remix 3 is a different product.
  2. Remix 3 is a beta. Use it for prototypes. Do not put it under a payment flow this quarter.
  3. The new component model is imperative. Plain variables, explicit update(), no hooks. Read the official beta post and judge it from real code, not from screenshots.
  4. Frames are the most interesting primitive. Server-owned HTML fragments with URLs. Worth a prototype even if you don't adopt the rest.
  5. Architectural direction matters more than this release. Frameworks are converging on smaller runtimes, server-first rendering, and fewer build-time abstractions. Whatever you ship next should be legible inside that direction.

The web platform has spent years catching up to the abstractions JavaScript frameworks built on top of it. Remix 3 is one of the louder bets that it's now caught up enough to write against directly. That is worth your attention — and a few hours of curiosity — even if it isn't yet worth your production traffic.

Back to all posts
Next step

Need help shipping software?

Tell us what you're trying to build. A discovery call, a one-page summary within 48 hours, a proposal within a week.

Response · 48h·NDA on request·US contracts only