Remix 3: a runtime-first JavaScript toolkit built on Web APIs
Build Better Websites. Create modern, resilient user experiences with web fundamentals.
At a glance
- What is it?
- Remix 3 is not the React framework you may remember. The repository now ships a set of standalone TypeScript packages, from a Fetch router to SQL data tables, composed into a single `remix` package for distribution.
- Who is it for?
- Adopt Remix 3 if you are building on the Fetch API and want small, replaceable packages for routing, cookies, headers, multipart parsing or SQL access, and you are comfortable tracking a repository that states it is under active development. Do not adopt it if you need a stable full-stack React framework today, or if your runtime cannot supply the Web APIs these packages assume.
- Can I use it commercially?
- Yes. MIT is a permissive licence: you can use, modify and sell software built on it, as long as you keep its copyright and licence notices.
- Is it still maintained?
- Yes. The repository last received commits 1 day ago.
- What is it written in?
- Mainly TypeScript, according to GitHub's language statistics.
Answers come from the project's GitHub data, last synced on September 29, 2026, and from our analysis. They are not legal advice.
Editorial analysis
What Remix 3 actually is, and who it is for
The repository at remix-run/remix is the source for Remix 3, and the README describes it as "under active development." The last push was on 2026-08-17, so the project is moving. What matters more for anyone deciding whether to adopt it is that Remix 3 is not primarily a React meta-framework. The README frames it around six principles, and two of them set the tone: "Religiously Runtime" and "Avoid Dependencies." The first says all packages must be designed with no expectation of static analysis and all tests must run without bundling. The second says the goal is zero dependencies, with anything borrowed wrapped completely and expected to be replaced.
The audience follows from that. This is for engineers building HTTP servers and full-stack JavaScript applications who want to write against the Fetch API and Web Streams rather than against a framework's own abstractions. The README lists Node.js, Bun, Deno and Cloudflare Workers as target environments, and says Remix code is "portable by default." If your application already lives on `Request`, `Response`, `Uint8Array`, `Blob` and `File`, the packages here are designed to slot in without a translation layer. If your application is built around Node's `Buffer` and `node:stream`, the fit is worse, and the README is explicit that those are the APIs being avoided.
The package layout: one umbrella, many single-purpose modules
The repository is a pnpm workspace. `pnpm-workspace.yaml` and the root `package.json` define `packages/*` as the workspace glob, and the root package is named `remix-the-web` with `"private": true`. That root package is the monorepo itself, not something you install.
The README states that "Remix will be distributed as a single `remix` package for both distribution and documentation," while every package that makes up Remix should also be usable standalone. The package list is long and specific: `fetch-router` for a minimal composable router on the Fetch API, `headers` and `cookie` for HTTP header and cookie handling, `multipart-parser` and `form-data-parser` for uploads, `data-schema` for validation, `data-table` with `data-table-sqlite`, `data-table-postgres` and `data-table-mysql` for relational queries, `auth` and `auth-middleware` for OAuth and OIDC, plus a set of middleware packages for CORS, CSRF, compression, logging, form data and async context.
The composition rule is stated directly: abstractions should be single-purpose and replaceable, and a new feature should first be attempted as a new package. That is why there are separate packages for `cors-middleware` and `csrf-middleware` instead of one security package. The trade-off is real. A flat list of forty-odd packages is harder to survey than a framework with one documented entry point, and the README acknowledges this by noting that "extremely composable ecosystems are difficult to learn and use," which is the stated reason for shipping the umbrella package.
Installing Remix 3 and making a first request
The README does not contain a step-by-step install section, so the reliable path is the package metadata. The root `package.json` sets `"packageManager": "[email protected]"` and `"engines": { "node": ">=24.3.0" }`, so a Node.js 24.3 or newer runtime is the baseline for working in this repository. The root scripts include `build`, `test`, `typecheck` and `lint`, all driven through pnpm.
To work on the monorepo itself, clone it and install with pnpm:
pnpm install
pnpm build
pnpm testThe `postinstall` script runs `node ./scripts/postinstall.ts`, so expect repository setup work during install rather than a bare dependency fetch. For consuming packages, the README's distribution model is the `remix` package, and individual packages are listed under `packages/` for standalone use.
A first real use is the router. The README describes `fetch-router` as "a minimal, composable router for the web Fetch API," which means the unit of integration is a `Request` in and a `Response` out. The pattern to expect from a Fetch-native router is that you construct a router, register routes, and hand it a request. The repository does not reproduce a full example in the README, so read `packages/fetch-router` before wiring it in. What you should see once it is running is an ordinary `Response` object, which is the point: it can be returned from a Node server, a Cloudflare Worker or a Bun server without adaptation.
The root `package.json` also carries a `generate-remix` script (`node ./scripts/generate-remix.ts`) and a `validate-remix-package` script, which suggests the umbrella package is generated from the individual packages rather than maintained by hand. If you are auditing what the `remix` package contains, those two scripts are where to look.
Where the runtime-first stance costs you
Principle three, "Religiously Runtime," is the most consequential design decision in the repository, and it cuts both ways. The README argues that designing for bundlers, compilers and type generation leads to poor API design that eventually pollutes the system, and that all tests must run without bundling. The practical consequence is that you cannot assume a build step will paper over runtime gaps. If your deployment target lacks Web Streams, Web Crypto or `Blob`, the packages have nothing to fall back on, because by design they do not reach for `node:stream` or `node:crypto`.
The second cost is maturity. The README opens by saying the repository "is under active development," and the release list shows packages at early version numbers, with `[email protected]` and `[email protected]` among the most recent. One of those releases is even labelled "[Superseded]," which tells you package boundaries are still moving. The README's own composition principle says features should first be attempted as a new package and existing packages should be broken up if needed. That is a reasonable way to keep interfaces honest, but it means a package you adopt today may be split or renamed later.
Finally, the README's first principle, "Model-First Development," states that source code, documentation, tooling and abstractions should be optimized for LLMs. That is an unusual priority to state publicly, and engineers who care about human-readable API ergonomics should read the package docs with that framing in mind rather than assuming the primary reader is a person.
How this differs from Next.js and from Remix v2 on React
The clearest comparison is with Next.js, and the difference is architectural rather than stylistic. Next.js is a React framework with its own compiler, routing conventions and server runtime, and it expects a build pipeline. Remix 3's README rejects that premise outright: packages must be designed with "no expectation of static analysis," and tests must run without bundling. In Next.js, the framework owns the request lifecycle and you write into its conventions. Here, `fetch-router` and the middleware packages operate directly on the Fetch API, so the request lifecycle is whatever your runtime provides.
The second comparison is with Remix v2 itself, which was a React meta-framework with loaders, actions and nested routes. Remix 3 as described in this repository is a different artifact: a collection of TypeScript packages for building web applications, with `data-table`, `auth`, `file-storage` and middleware as first-class concerns. The README's distribution note, that Remix ships as a single `remix` package, is about packaging, not about restoring the v2 programming model. Anyone arriving from Remix v2 should read the package list before assuming migration is a rename.
A third reference point is Hono, which also targets the Fetch API and runs across runtimes. The difference visible here is dependency policy. Remix 3 states the goal is zero dependencies and that anything borrowed should be wrapped completely and replaced eventually. That is a stricter position than most Fetch-era frameworks take, and it is the reason the repository contains its own `cookie`, `headers`, `mime` and `multipart-parser` packages instead of depending on established ones.
Licence, maintenance signals and what an upgrade costs
The repository is MIT licensed, and the root `LICENSE` file is the authoritative copy. MIT is permissive: it allows use, modification and redistribution with the copyright notice and permission notice retained. That is a statement about the licence text, not legal advice, and if you are redistributing the packages inside a product you should read the file yourself rather than rely on a summary.
On maintenance, the facts available are that the repository is not archived and its last push was on 2026-08-17. That is recent, and the release list shows `[email protected]`, `[email protected]` and `[email protected]` all published on the same day. The repository also carries `CONTRIBUTING.md`, `MAINTAINING.md`, `SECURITY.md`, `AGENTS.md` and `CLAUDE.md`, plus a `decisions/` directory, which indicates the project documents its own process rather than leaving it implicit.
Upgrade cost is the harder question, and the version numbers are the signal. `[email protected]` is pre-1.0, and the composition principle explicitly permits breaking up packages to make them more composable. The root `package.json` provides `changes:preview`, `changes:validate` and `changes:version` scripts, so the project runs a changeset-style workflow you can read before upgrading. For a dependency you plan to pin, that workflow is the thing to check on each release, because the package you depend on may be renamed or absorbed into the `remix` umbrella. The root `sync-remix-package-files` and `validate-remix-package` scripts exist precisely to keep the umbrella consistent with the individual packages, which is a maintenance burden the project has chosen to automate rather than avoid.
Editorial conclusion
Adopt Remix 3 if you are building on the Fetch API and want small, replaceable packages for routing, cookies, headers, multipart parsing or SQL access, and you are comfortable tracking a repository that states it is under active development. Do not adopt it if you need a stable full-stack React framework today, or if your runtime cannot supply the Web APIs these packages assume. Before committing, check the `packages/` directory for the specific package you intend to use, read its own README for its API surface, and confirm it has a published version rather than only a workspace entry.
Frequently asked questions
How do I install Remix 3?
The README does not give a consumer install command. For the repository itself, the root package.json sets the package manager to [email protected] and requires Node.js 24.3.0 or later, so the workflow is to clone the repo and run pnpm install followed by pnpm build. Individual packages are listed under packages/ for standalone use, and the README says Remix is distributed as a single remix package.
What is Remix 3 built on?
The README states it is built on Web APIs and JavaScript, using the Web Streams API instead of node:stream, Uint8Array instead of Node.js Buffers, the Web Crypto API instead of node:crypto, and Blob and File instead of runtime-specific APIs. The stated benefit is portability across Node.js, Bun, Deno and Cloudflare Workers.
Is Remix 3 stable enough to use in production?
The README says the repository is under active development, and the recent releases include [email protected] and [email protected], so several packages are pre-1.0. The README also states that new features should first be attempted as a new package and existing packages may be broken up, which means package boundaries can still change.
What packages does Remix 3 include?
The README lists packages for routing (fetch-router), HTTP headers and cookies, multipart and form-data parsing, schema validation (data-schema), relational queries (data-table with SQLite, PostgreSQL and MySQL backends), authentication (auth and auth-middleware), file storage including S3, and middleware for CORS, CSRF, compression, logging and async context.
Official sources
Add this badge to your README
If you maintain this project, the badge below links readers to this analysis and shows its maintenance status from the daily GitHub snapshot. Paste the markdown into your README; add ?metric=license or ?metric=stars to the image URL for a different field.
[](https://hysenlabs.com/projects/remix-run-remix)