Summary:
Pull Request resolved: https://github.com/react/react-native/pull/57630
**Motivation**
- Flagged as a papercut by Expo: `chrome-launcher` (and `chromium-edge-launcher`) constitute duplicate code (vs Expo's vendored version), and we can lighten our core package by dropping these dependencies.
- `launchDebuggerAppWindow` is now a fallback (since the rollout of the RNDT desktop shell), and we can reasonably delegate more rigorous browser detection to frameworks.
**This diff**
Remove both `chrome-launcher` dependencies and their usages in the `launchDebuggerAppWindow` code path. In their place, use `open` (bumped to 8.x)'s `openApp` API for Chrome only.
Changelog:
[General][Changed] - **React Native DevTools**: When using the fallback flow for launching DevTools (desktop app fails to launch), Microsoft Edge will not be attempted. DevTools will open as a standard window in the default browser.
Reviewed By: robhogan
Differential Revision: D113055240
fbshipit-source-id: e3dfb7df58160eae0ec13ae7403d3d7c7dc2a84b
Summary:
Pull Request resolved: https://github.com/react/react-native/pull/57612
Cleanup — these types are already declared in `react-native-github/flow-typed/environment/node.js` and resolve under Flow. The `$FlowFixMe[cannot-resolve-module]` suppressions on these imports are therefore stale.
Changelog: [Internal]
Reviewed By: robhogan
Differential Revision: D112803683
fbshipit-source-id: e7d248527809748bbee5864d0a0fe83e45fdcc23
Summary:
Pull Request resolved: https://github.com/react/react-native/pull/57611
Directly follows D112733139 (Metro).
**Motivation**
- New Node builtins are *only* available under the prefix (e.g. `node:sqlite`), as this allows Node to introduce them without ecosystem-breaking changes, so this is the direction of travel and the only choice that'll allow consistency.
- Encouraging them and grouping them separately makes it easier to reason about a module's 3rd party dependencies.
Changelog: [Internal]
Reviewed By: robhogan
Differential Revision: D112803684
fbshipit-source-id: 40668d746a7151b3aa4800ff8af997902a18d198
Summary:
Pull Request resolved: https://github.com/react/react-native/pull/57273
**Motivation**
A README is the first thing an npm visitor sees on each package; internal-repo boilerplate like the "Testing" sections and the "We're using yarn…" note doesn't belong on a published package page.
**Changes**
- Standardize every README: a `# react-native/<name>` heading, a user-facing description, and a blue version badge plus a green monthly-downloads badge.
- Keep the "internal dependency" prelude only on `community-cli-plugin`, `virtualized-lists`, and `js-polyfills`.
- Drop the monorepo-template "Testing" sections and yarn note.
- Rework `metro-config` around the Configuring Metro guide; add missing READMEs for `metro-babel-transformer` and `popup-menu-android`.
Changelog: [Internal]
Reviewed By: emily8rown
Differential Revision: D109017270
fbshipit-source-id: 6208294c4ad2e6235a6605ae54f22d730f0476e7
Summary:
Pull Request resolved: https://github.com/react/react-native/pull/57258
Reflecting the move to https://github.com/react/react-native , update references in first-party `package.json`s
The `repository.url` field in particular is load-bearing for Trusted Publish.
Changelog: [Internal]
___
Reviewed By: fabriziocucci
Differential Revision: D108986410
fbshipit-source-id: 78513ffefc32ddf417dc1479a4834ebc44240080
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/57034
With D107165685, it should work this time.
Changelog: [Internal]
Reviewed By: gkz
Differential Revision: D107111468
fbshipit-source-id: 326b2911088d7c87c3564a578125eeaab9d0b8cc
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/56998
Reverts the recent Flow syntax codemods applied across `packages/`, `private/`, and `scripts/` in react-native-github. Specifically restores the previous form for:
- `+T` / `+Instance` style variance annotations on generic type parameters that had been converted to the newer `out T` / `in T` keyword form.
- `+field:` covariant object/interface properties that had been converted to the `readonly field:` modifier form.
- `+[K in keyof T]:` mapped-type covariance that had been converted to `readonly [K in keyof T]:`.
These are purely Flow type-annotation changes with no runtime behavior impact, restoring the form that the rest of the toolchain (in particular Fantom) already supports.
Changelog: [Internal]
Reviewed By: christophpurrer
Differential Revision: D106813102
fbshipit-source-id: 6bf915d530e130eba9c9d96a2b6c3dc8853594d1
Summary:
Remove duplicated words from comments in a release script, a dev middleware test helper, the Gradle plugin JDK utility, and the virtual view render state.
## Changelog:
[INTERNAL] [FIXED] - Fix duplicated words in source comments.
Pull Request resolved: https://github.com/facebook/react-native/pull/56985
Test Plan: Comments.
Reviewed By: cortinico
Differential Revision: D106615714
Pulled By: fabriziocucci
fbshipit-source-id: cbb08abc5c0e6fbcfe2299c00aa05e67901b9f4c
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/56887
Drop support for Node.js 20. The minimum supported version is now `^22.13.0 || ^24.3.0 || >= 26.0.0`.
Node.js 20 reached end-of-life in April 2026 and is no longer actively maintained. This aligns React Native with the upcoming Metro requirement.
Changelog:
[General][Breaking] - Require Node.js >= 22.13.0
Reviewed By: christophpurrer, cortinico
Differential Revision: D105685641
fbshipit-source-id: f490e5a13e4289daba98c4d56dd8fdd341aef0db
Summary:
This PR adds the missing test coverage for the standalone Fusebox debugger shell in `StandaloneFuseboxShell-test`.
First, I added some missing expectation for the success case (`enableStandaloneFuseboxShell=true` and no errors) already present:
- the assertion that `unstable_prepareFuseboxShell` is called just one time during middleware initialization
- the assertion that `launchDebuggerAppWindow` is never called when the standalone shell is available
Then, I added the missing test for the case when `unstable_prepareFuseboxShell` returns one of the error code like eg. `platform_not_supported` (as reported also in the TODO that I removed).
In this way now the test is verifying the full behaviour for the new standalone mode for debugger/dev tools.
## Changelog:
[GENERAL] [CHANGED] - Added missing tests for Standalone fusebox shell
Pull Request resolved: https://github.com/facebook/react-native/pull/55460
Test Plan:
- Ran `StandaloneFuseboxShell-test` and verify all tests cases passed
- Ran the full React Native test suite to ensure all tests pass.
- Verified test correctness by intentionally breaking production code:
- removing the calls to the `DefaultBrowserLauncher` in `openDebuggerMiddleware` to verify that the tests were correctly failing
Reviewed By: Abbondanzo
Differential Revision: D93157076
Pulled By: huntie
fbshipit-source-id: 51c12ad67dd929035f779b53add9163a6619cf41
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55728
Fixes unwanted side effect launches of the debugger shell in tests (likely introduced in D88161573!).
Also adds error guard on `DefaultAppLauncher` to ensure that the implementation is always mocked.
Changelog: [Internal]
Reviewed By: vzaidman
Differential Revision: D94230761
fbshipit-source-id: 966f6f09c38aa55594091bd7d34a5c78dc6eee93
Summary:
Renames the **"BrowserLauncher"** concept (`unstable_browserLauncher`) to **"DevToolLauncher"** (`unstable_toolLauncher`), since the scope is now widened to open the desktop debugger shell by default.
Also rename and remove `unstable_` prefixes for `launchDebuggerShell` and `prepareDebuggerShell` methods (APIs remain unstable on the root option key).
**Why not `DebuggerLauncher`?**
This naming remains wide enough to cover other host process delegation in future (e.g. opening other secondary tools, or opening a generic URL in the browser). Debugger launching methods remain specifically named to match their intent.
Changelog: [Internal]
Reviewed By: vzaidman
Differential Revision: D94218654
fbshipit-source-id: e59d5465f200666cd0f1a189414f2223f5e46f69
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55549
**Context**
Clean up the legacy `rn_inspector.html` entry point. React Native DevTools has been the default since 0.76, and we have now removed all internal dependencies at Meta.
**This diff**
- Remove `prefersFuseboxFrontend` metadata from `unstable_eventReporter` API.
Changelog: [Internal]
Reviewed By: vzaidman
Differential Revision: D93247602
fbshipit-source-id: 278f847433259c98deb121562e34a12ff59058a2
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55548
**Context**
Clean up the legacy `rn_inspector.html` entry point. React Native DevTools has been the default since 0.76, and we have now removed all internal dependencies at Meta.
We've verified that Reanimated (`react-native-worklets`) also do not depend on this workflow, and documents `chrome://inspect` instead.
**This diff**
- Launching the debugger will no longer check for the `prefersFuseboxFrontend` capability flag (internal contract with the debugger server).
- The modern `rn_fusebox.html` entry point will always be used.
Changelog: [Internal]
Reviewed By: vzaidman
Differential Revision: D93247604
fbshipit-source-id: 1c7b6838d9105c9206ffc0030374dc1ee559a6dd
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55574
Upgrade the undici devDependency in react-native/dev-middleware from ^5.29.0 to ^6.23.0 to address security vulnerabilities. undici v6 drops the fastify/busboy dependency and requires Node.js >= 18, which is already satisfied by the engine requirements. The API surface used (Agent, request) remains compatible.
this is low risk, because it's only used in a test.
Changelog: [Internal]
Reviewed By: robhogan
Differential Revision: D93298172
fbshipit-source-id: be623702ebec1bd494c862f9c7990580f6b3cc4d
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55285
Changelog: [GENERAL] [CHANGED] - `createDevMiddleware` now accepts `string | URL` for `serverBaseUrl`
Replaces the serverBaseUrl string type with a native URL object across the Metro CLI and Gateway packages.
This change improves type safety and makes URL manipulation more robust by leveraging the built-in URL API instead of string concatenation.
The public createDevMiddleware API has been updated to accept either a string or URL for the serverBaseUrl option.
Internally within the dev-middleware package, the internal APIs (InspectorProxy, openDebuggerMiddleware, getDevToolsFrontendUrl) use URL objects instead of strings.
https://www.npmjs.com/package/react-native/dev-middleware
Reviewed By: vzaidman
Differential Revision: D90987090
fbshipit-source-id: ec5b8faa4ed5c24b489c3d63f7b6030073be5403
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55237
Adds multi-session support to the Node side of the inspector-proxy protocol implementation. The protocol now has an explicit `sessionId` property in all relevant messages.
Multi-session support is fully backwards compatible:
* An app that does not report itself as multi-session capable will get the old proxy behaviour.
* If the `enableStandaloneFuseboxShell` experiment flag is disabled by the integrator/framework, we automatically disable multi-session support, too. This is to guarantee that we continue to have at most one active RNDT window/tab open per app. (The standalone shell guarantees this independently of the proxy, while the old browser-based flow requires the proxy to keep enforcing the single-session UX.)
Changelog: [General][Added] Support multiple CDP connections to one React Native Host (diff 2 of 2)
Reviewed By: robhogan
Differential Revision: D90174643
fbshipit-source-id: b277cf2777d2018c44252dc4eae7b197e51cfb79
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55238
Adds multi-session support to the inspector-proxy protocol, specifically to the C++ `InspectorPackagerConnection` class that implements the "device" side of the protocol.
Changelog: [General][Added] Support multiple CDP connections to one React Native Host (diff 1 of 2)
Reviewed By: hoxyq
Differential Revision: D90174642
fbshipit-source-id: b22946aaa5a6f3d2d4a81cbfe81d371ea2bc0632
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55268
Allow WS debugger connection to origin from debugger url.
Also notify the user on Metro if a connection is rejected.
Changelog: [General][Fixed] - Reaching Metro from Debugger on urls other than localhost:8081 and 127.0.0.1:8081.
Reviewed By: robhogan, yungsters
Differential Revision: D91130956
fbshipit-source-id: 107dbc78aa60b888325f5c6dca68cc28f4e6af52
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55235
Use of Node's `url.parse` is deprecated and emits a runtime warning (when used in 1P code) from Node 24.
This wouldn't directly affect RN users, but does create noise running from monorepo source.
Changelog: [Internal]
Reviewed By: GijsWeterings
Differential Revision: D90992431
fbshipit-source-id: d53e2837cd13bba3fbb24302c5916038ae0e5a50
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55114
Our official [docs](https://reactnative.dev/docs/set-up-your-environment#node--watchman) require:
> Node 20.19.4 or newer
Currently, our `package.json#engines` fields express this as `"node": ">= 20.19.4"`
This is a bit imprecise because of Node's overlapping release lines - e.g. v24.0.0 is actually older than v20.19.4 (2025-07-15), and the whole v21 line was already EOL before v20.19.4.
The release *date* is relevant because Node.js frequently backports the most important updates - notably, `require(esm)` is already stable in Node 20.19 but is not unflagged in v22 until v22.12.
This makes the `package.json#engines` requirement truer to the documented requirement, dropping some old minors and EOL majors that prevent us using features included in v20.19.
Notably, `require(esm)` is stable and unflagged on all versions supported from this diff.
- v21 and v23 are EOL, so are dropped.
- v22.13 pre-dates 20.19.4 and is the first to have unflagged silent `require(esm)`
- v24.3.0 pre-dates 20.19.4 and is the first to unflag TS-stripping
- Support v25 and newer.
Changelog:
[General][Breaking] Drop support for EOL Node.js lines and old minors.
Reviewed By: cortinico, huntie
Differential Revision: D90467358
fbshipit-source-id: a5fdfb1b93a9d6cffe78eb6811ff7420ab906f44
Summary:
Related to https://github.com/facebook/react-native/issues/54669
This version bump drops `rimraf`.
This has been raised at a sync before, but it'd be great to instead drop or replace this entirly. I also noticed that it pulls in `types/node@*`, which isn't necessary for it to function as well, and generally, it'd be nice if we had an alternative here.
cc huntie
## Changelog:
[GENERAL] [SECURITY] - Bump to `chromium-edge-launcher@^0.3.0` to drop `rimraf`
Pull Request resolved: https://github.com/facebook/react-native/pull/54711
Test Plan: - Package hasn't changed except for `rimraf` having been dropped
Reviewed By: huntie, cortinico
Differential Revision: D87978681
Pulled By: robhogan
fbshipit-source-id: b761493f677f9cd4008d3fda584dd04de40c0845
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55075
It's been >1y since we introduced this notice (and introduced the `--client-logs` flag) — clean up.
Changelog:
[General][Changed] - Remove "JavaScript logs have moved!" notice from dev server CLI
Reviewed By: hoxyq
Differential Revision: D90247471
fbshipit-source-id: dc13c90476c65c301bdb3a51db91f0e5fe0b326b
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/55008
Changelog: [Internal] removed an unstable function briefly added in #54447
This was previously added in https://github.com/facebook/react-native/pull/54447, but not needed anymore as we found a different way to get this information without exposing a special API for that.
Reviewed By: robhogan
Differential Revision: D89962175
fbshipit-source-id: 3636ef8815678781ee39ef8211f00bde69b5ce63
Summary:
### Motivation
Updates the shared JavaScript build setup to use the modern `publishConfig` convention.
This:
- Simplifies the build script.
- Makes the production values for `"exports"` more understandable in place (especially by separating from exports conditions).
- Prevents us from creating a dirty file state when running `yarn build`.
### Changes
- Add `publishConfig` to each `package.json` listing production `"exports"` targets.
- Add `scripts/build/prepack.js` script to action `publishConfig` (now on `npm pack`, `npm publish` exclusively).
- Remove `"exports"` rewriting (and un-rewriting safeguards) from build script.
**Note on `"prepack"`**
Slightly unfortunately, `publishConfig` doesn't work consistently between package managers currently, including npm — so this does not work implicitly (but may in future).
We're instead following `publishConfig` as a convention, and explicitly implementing a full copy (theoretically forking us towards pnpm and Yarn v4's approach).
However, I believe this is:
- Worthwhile, for the motivations above — and in particular being able to understand the final shape of `"exports"` (independent from the dimension of conditional exports, which may come into play later).
- Completely inspectable/maintainable as an explicit implementation (`scripts/build/prepack.js`).
Changelog: [Internal]
Pull Request resolved: https://github.com/facebook/react-native/pull/54857
Test Plan:
### CI
✅ GitHub Actions
### End-to-end release test script
(Note: Rebased on `0.83-stable` when tested)
```
yarn test-release-local -t "RNTestProject" -p "iOS" -c $GITHUB_TOKEN
```
{F1984106139}
✅ Test script runs `npm publish` on packages to a local proxy.
{F1984106146}
✅ Installed packages have `publishConfig` `"exports"` values applied
NOTE: ⬆️ This is **exactly** the same output as before.
{F1984106148}
✅ `/tmp/RNTestProject` runs using built + proxy-published + proxy-installed packages
Reviewed By: cipolleschi
Differential Revision: D88963450
Pulled By: huntie
fbshipit-source-id: f328252cf93a1f1039b79d7f369d1e6e7e5b4b52
Summary:
Pull Request resolved: https://github.com/facebook/react-native/pull/54528
Changelog: [Internal]
Currently, `DefaultBrowserLauncher.js` holds arguments configuring how the debugger shell is launched. Instead, move some of them downstream, and make `DefaultBrowserLauncher.js` use the defaults.
Reviewed By: motiz88
Differential Revision: D86772692
fbshipit-source-id: 826bb6236dc3cba3c4b0d455aebf3f81c4e8ed6f