Michael Jackson, co-creator of React Router, said it best:
React Router isn't just mine and Ryan's baby anymore. It is a mature OSS project with millions of dependents. We want everyone to have a say in how the project moves forward.
React Router has been around for over 10 years under the development and oversight of Michael and Ryan. When they obtained funding for Remix in 2021 and built a team around Remix, they also indirectly built a team around React Router. That team has been working on React Router for a few years now, and it's time to formalize the process we've loosely been using internally for a while now.
Last week in our "Wake Up, Remix!" post, we announced a new Open Governance Model for React Router. We planned to announce these in the reverse order: first the governance model, so folks knew that React Router wasn't going anywhere, followed by our plans for Remix v3.
However, the leaked draft version of the Remix announcement (you can go find that yourself) forced our hand, and we had to get that post out quicker than anticipated. This meant we didn't get to give the new governance model proper focus and an announcement, so we're doing that now. We think it's just as exciting for the web community and the future of React Router!
React Router has gone through many major evolutions in its 10+ year lifetime, many of those dictated by the evolution of React itself (i.e., the introduction of hooks). With the recent integration of Remix v2 into React Router v7, the API surface has increased even more. And with the arrival of React 19 and (soon) RSC support, React has taken on aspects previously handled by React Router.
While we don't want to ignore new features moving forward (we have lots of ideas we want to ship!), we do want to be cognizant of the increasing surface area and focus on where we can shed some APIs to keep React Router "lean". In addition to shedding responsibility to React, we also see opportunities to introduce new APIs that encapsulate the behavior of multiple existing APIs so we can simplify the project by deprecating them in a future major version.
To ensure we're headed in the right direction, we want to keep the following design goals in mind as we consider new features moving forward. We think a more formalized process guided by a Steering Committee is the best way to do that:
declarative -> data -> framework
) and then leveraged by the higher-level modes. This ensures that the largest number of React Router applications can leverage them.We also hope that this new process will permit more community-driven evolution of React Router and reduce any bottlenecks that can arise in a Founder-Leader model.
In case you haven't noticed, our team has been cooking (we can't spend all our time leaking blog posts and confusing you with our branding).
React Router v7 has been out just over 6 months, and if you've been watching our changelog closely, your react-router.config.ts
file may look like this:
import type { Config } from "@react-router/dev/config";
export default {
future: {
unstable_middleware: true, // finally
unstable_splitRouteModules: true, // lean, mean route modules
unstable_subResourceIntegrity: true, // that seems useful
unstable_viteEnvironmentApi: true, // RSC wen?
unstable_optimizeDeps: true, // better dev
},
} satisfies Config;
We're feeling pretty good about a lot of these features, so it's about time we start documenting and stabilizing each of them. Hopefully at that point your Staff Engineer will stop yelling at you for using something with an unstable_
prefix.
We already have plans to add the following:
useRouterState()
a hook to consolidate router stateuseRouteLoaderData()
(should probably write that RFC up š
)AbsoluteRoutes
component to help people who are still on v5 upgrade (we see you, you're not alone)Plus, as mentioned above, we want to take a look at any APIs we can start deprecating in lieu of just-as-good or better React APIs (<title>
, <meta>
, <link>
, <ViewTransition>
, etc.). Some words of comfort here before you start throwing tables:
meta
and links
exports, we'll likely deprecate in v8 and remove in v9useFetcher
cough)The goal here is to simplify React Router's APIs and reduce the number of ways you can do the same thing. This will make it easier for you (and LLMs) to use React Router, and for us to write it. If you are happy with the number of APIs we have, please see our API reference and consider if it still sparks joy.
The roadmap to React Router v8 is looking pretty good if we do say so ourselves. We've got some proposals to write and some work to do.
While the Steering Committee consists only of members of the Remix team (for now), we genuinely want more feedback and contributions from the wider React Router community.
From the Governance doc:
The process for new features being added to React Router will follow a series of stages loosely based on the TC39 Process. It is important to note that entrance into any given stage does not imply that an RFC will proceed any further. The stages will act as a funnel with fewer RFCs making it into subsequent stages such that only the strongest RFCs make it into a React Router release in a stable fashion.
Exact details may change (always refer to GOVERNANCE.md
for the latest), but the basic gist is:
unstable_
prefix is opened for early community testing before merging.unstable_
prefixes and add documentation.These changes to how React Router is developed are only a slight tweak to how we've been working for years, and will ensure React Router continues evolving for years to come
Time to keep Building Better Websites!
This is a joke. Therapy is a legitimate and useful tool that has helped countless people (including within our team) deal with mental and emotional issues. It should probably not be used for something as small as periodic breaking changes in open source software. ā©