github.com-facebook-react-native
all · 63 devs · built 2026-06-13
Repository snapshot
Monthly reports
Highlights
- Introduced a new *StatusBar* "auto" barStyle value for dynamic system theme adaptation [61c8b040 · Mathieu Acthernoene].
- Enhanced the *Fantom test runner* with `getHostPlatform()` to determine host OS, improving test adaptability [9199b393 · Rubén Norte].
- Added an opt-in debug overlay for *Fabric image component views* to visualize image request priorities [d4ae8816 · Samuel Susla].
- Optimized *Fabric image loading performance* on Apple platforms by downgrading offscreen image requests to prefetch priority [commit/5fbcc2bf].
- Improved the *DevTools Network tab* on Android to show structured payload previews for `FormData` and one-shot file uploads [48fe6df3 · HarshitMadhav].
- Introduced a `trace` helper function to the *Systrace* module, simplifying performance instrumentation and ensuring reliable trace section closure [e6c7a269 · Rubén Norte].
- Enhanced *Android image prefetching* with granular cache control by wiring the image source's cache strategy into `MapBuffer` conversions [45d9b13d · Peter Abbondanzo].
Observations
- The *Maintenance* score increased by 50% (18 current vs 12 2-month average), indicating a strong focus on code quality, refactoring, and internal improvements.
- The *Waste* score decreased by 29% (5 current vs 7 2-month average), suggesting improved efficiency and fewer reverted or problematic changes.
- The *Grow* score decreased by 27% (10 current vs 13 2-month average), alongside a 20% reduction in total commits (231 current vs 290 2-month average), reflecting a shift away from new feature development towards stability and maintenance.
- A significant number of commits focused on *Kotlin migration* for Android components, including `UIViewOperationQueue` [7a8344c0 · Nicola Corti] and `BridgeReactContext` [6720760f · Nicola Corti], as part of ongoing language adoption.
- Extensive *Flow type system improvements* were observed, with multiple commits applying `readonly` modifiers [88857d22 · Marco Wang], fixing variance issues [707e3665 · Marco Wang], and codemodding `in/out` annotations [9f558a4d · Marco Wang], enhancing type safety and consistency.
- Several feature flags were removed, indicating the completion of rollouts and simplification of the codebase, such as `enableMainQueueCoordinatorOnIOS` [eaf77043 · Pieter De Baets], `enableVirtualViewDebugFeatures` [083fd99b · Pieter De Baets], `enableEagerMainQueueModulesOnIOS` [36bec56b · Pieter De Baets], and `useUnorderedMapInDifferentiator` [58012fb4 · Samuel Susla].
- Multiple critical bug fixes addressed stability issues, including a *ViewTransitionModule* timing issue [ee43ce7d · Zeya Peng], an Android *Fabric Native Animated* crash [4d36e578 · jingjing2222], `IllegalArgumentException` in *ScrollView.onTouchEvent* [d672c964 · Tomek Zawadzki], and incorrect *percentage-based border radius* rendering on iOS [b4966128 · Jakub Piasecki].
- Performance optimizations were implemented, such as avoiding expensive exception throws in `SynchronousMountItem` to prevent ANRs [54b9af1a · Dawid Małecki].
- Several commits lacked specific type and score information, making a detailed impact assessment difficult for those particular changes.
Performance over time
ETV stacked by Growth, Maintenance and Fixes — 90-day moving average, normalized to ETV / month.
Average performance per developer
ETV per active developer per month — 30-day moving average.
Active developers over time
Unique developers committing each day — 90-day moving average.
Knowledge concentration
How dependent is this repo on a small number of contributors? Higher top-1 share = higher key-person risk.
Rubén Norte owns 8.7 % of commits.
Top contributors
Most impactful commits
Top 20 by ETV in the all-time window.
- 4.1ETVMove c++ native animated code to github (#51509) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/51509 ## Changelog: [Internal] [Added] - Move c++ native animated code to github ⚠️ Note that this is not buildable in OSS yet ⚠️ Reviewed By: sammy-SC, rshest Differential Revision: D75169430 fbshipit-source-id: 499ce209f815474f12007c3c74f81fe0c9ad3f86Zeya Peng · cb02744f · 2025-05-22
- 3.0ETVGenerate nested scroll view (#55239) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55239 This diff adds the ability to experiment with using `NestedScrollView` instead of `ScrollView` as the parent class for `ReactScrollView` on Android. Since Java doesn't support multiple inheritance or conditional parent class selection, this is implemented using code generation: - A Node script (`generate-nested-scroll-view.js`) generates `ReactNestedScrollView.java` and `ReactNestedScrollViewManager.kt` from their respective source files - The generated files are identical to the originals except they extend `NestedScrollView` instead of `ScrollView` - A Buck genrule verifies the generated files stay in sync with source files at build time - The `useNestedScrollViewAndroid` feature flag controls which implementation is used at runtime This approach allows us to safely A/B test the NestedScrollView implementation without requiring JS changes, since both managers register with the same `REACT_CLASS` name (`"RCTScrollView"`). Changelog: [Internal] Reviewed By: alanleedev, javache Differential Revision: D90902079 fbshipit-source-id: 96ccd25b9a217b8e0cd4e3b542b9dda67047cde3Peter Abbondanzo · 5e93036a · 2026-01-21
- 2.0ETVDelete fixTextClippingAndroid15useBoundsForWidth() (#56282) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56282 Fixes https://github.com/facebook/react-native/issues/56185 Fixes https://github.com/facebook/react-native/issues/56186 Fixes https://github.com/facebook/react-native/issues/56187 Delete the `fixTextClippingAndroid15useBoundsForWidth()` feature flag and all code gated behind it. This flag was never shipped, and the new code path has been implicated in several bugs. The change removes: - The feature flag definition and all generated plumbing (C++, JNI, Kotlin, JS) - The visual-bounds-based width measurement path in `TextLayoutManager.kt` - The `setUseBoundsForWidth(true)` call in `buildLayout()` - The MobileConfig parameter (`react_fabric.fix_text_clipping_android_15_use_bounds_for_width`) - The Facebook Android and OSS Experimental overrides The old advance-based width logic is retained as the sole code path. Changelog: [Internal] Reviewed By: cortinico Differential Revision: D98427218 fbshipit-source-id: 7c322353d9c0a0548386a486ecd4280b73a66872Nick Gerleman · 5964a197 · 2026-03-31
- 1.9ETVDowngrade offscreen Fabric image requests to prefetch (#56976) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56976 changelog: [internal] Use Fabric layout data to classify image shadow nodes as visible or offscreen on Apple platforms. Offscreen image requests now use `ImageRequestPriority::Prefetch`, which is bridged to the existing `RCTImageLoaderPriorityPrefetch` API, while visible images stay at `Immediate`. The new React Native feature flag defaults to `false` until app-specific gating wires it up. Reviewed By: javache Differential Revision: D106074485 fbshipit-source-id: 80ece75cf0d639be1fdbfdd5f19b838b7b64aba6Samuel Susla · 5fbcc6bf · 2026-05-27
- 1.8ETVFix jagged edge rendering on API 28 (#54525) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/54525 Older versions of Android's clipPath APIs do not properly support antialiasing and BackgroundStyleApplicator relies on this API to clip to border radii that are smaller than provided images or views. As a result, this often leaves jagged edges on the outer edges of these images. Android even calls this out in their documentation under the "Canvas.clipPath" section of https://developer.android.com/topic/performance/vitals/render#common-jank. This change introduces a new API in BackgroundStyleApplicator called `clipToPaddingBoxWithAntiAliasing` which takes an additional argument over the existing `clipToPaddingBox`: a draw call. If non-null and the Android API is 28 or lower, a new drawPath operation is used to mark the pixels outside of the drawn contents as transparent. Changelog: [Android][Fixed] - Fixed antialiasing issues from border radius usage in API <= 28 Reviewed By: haixia-meta, lenaic Differential Revision: D86263195 fbshipit-source-id: 5dba744da08a3c9297f921baf7d4f1a354404f74Peter Abbondanzo · e08abbcb · 2025-11-14
- 1.5ETVConvert `ReactHorizontalScrollView` to Kotlin (#57045) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/57045 Convert `ReactHorizontalScrollView.java` to `ReactHorizontalScrollView.kt` using idiomatic Kotlin while preserving the public API surface. Key changes: - `ReactHorizontalScrollView.java` replaced by `ReactHorizontalScrollView.kt` - `ReactHorizontalScrollViewManager.kt` updated to use Kotlin property access syntax for `scrollEnabled`, `stateWrapper`, and `fadingEdgeLengthStart/End` - Static helper methods (`findDeepestScrollViewForMotionEvent`) moved into the companion object - Public API surface preserved: only additive `synthetic` constructor from `JvmOverloads` Changelog: [Android][Changed] - Convert `ReactHorizontalScrollView` from Java to Kotlin Reviewed By: Abbondanzo Differential Revision: D107236883 fbshipit-source-id: 37fb0f646193c2fc88008196f0db6e7307332109Nicola Corti · 5c680995 · 2026-06-04
- 1.4ETVClear RuntimeScheduler queues on error (#56892) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56892 changelog: [internal] Add `enableRuntimeSchedulerQueueClearingOnError` and use it in `RuntimeScheduler_Modern` to clear pending tasks, pending rendering updates, and pending surface IDs before forwarding task or microtask errors to `onTaskError`. Update `SchedulerDelegateInvalidationTest` so `enableSchedulerDelegateInvalidation` can be disabled while the new queue-clearing flag is enabled, proving that stale rendering updates and queued follow-up tasks are dropped after an error. Reviewed By: christophpurrer Differential Revision: D105696366 fbshipit-source-id: 24aa04a8084fb1534bb85785558b503bb8cf619cSamuel Susla · 9cbddbd4 · 2026-05-20
- 1.4ETVFormalize Text in JS as overflow: hidden by default (fixes overflow: visible text with props 2.0) (#55553) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55553 RN components on the native side currently act like a mix of both overflow: hidden and overflow: visible, veering closer to the former in the ways that matter most. PreparedLayoutTextView lets us implement this more correctly, and either clip text to padding box, or not clip the text at all. For compat, PreparedLayoutTextView/PreparedLayoutTextViewManager defaulted to `overflow: hidden`. Props 2.0, broke this, since we need to see overflow state change in Fabric props, which defaults to Yoga blank style defaults (always `overflow: visible`). The sanest solution I could find was to change Android native view to keep same defaults as Fabric style layer, then explicitly set `overflow: hidden` at the style layer, as the default behavior. This does slightly change behavior, so that components which previously clipped at the bounding rect of their border box, now clip at their padding box. I.e. text will not be drawn over borders, or rounded corners, by default after this change. Changelog: [General][Changed] - Text is no longer drawn on top of borders by default [General][Changed] - Text outside the bounds of a borderRadius is now hidden by default Reviewed By: mdvacca Differential Revision: D93324626 fbshipit-source-id: 955975f01ca0333dd135e236f26f5dab828a7491Nick Gerleman · 2111bec8 · 2026-02-20
- 1.4ETVCSS Grid 1/9: Grid style types and public API (#55876) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55876 - Add foundational data types, enums, style properties, and C API for expressing CSS Grid layouts - Includes `GridLine.h`, `GridTrack.h`, `GridTrackType.h`, `Display::Grid`, new alignment enums (`Align::Start/End`, `Justify::Auto/Stretch/Start/End`) - C API: `YGGridTrackList.h/cpp`, `YGNodeStyle` grid setters/getters - Layout helper updates, `Node.h` `relativePosition` made public Split from https://github.com/facebook/yoga/issues/1865. Part of the CSS Grid implementation series. Changelog: [Internal] X-link: https://github.com/facebook/yoga/pull/1893 Reviewed By: sammy-SC Differential Revision: D94867121 Pulled By: NickGerleman fbshipit-source-id: adcb6d107cdd782550a614f87f84cff3ecefd806nishan (o^▽^o) · 26cef641 · 2026-03-05
- 1.4ETVConvert to Kotlin - ReactEditText Summary: This diff converts the last java file inside `com.facebook.react.views.textinput` to Kotlin. As `ReactEditText` is quite involved, reviewing this one is going to be quite critical. I'm marking this as breaking as a number of nullability types has changed for OSS users. Changelog: [Android] [Breaking] - com.facebook.react.views.textinput.ReactEditText is now in Kotlin. If you're subclassing this type you'll need to adjust your signatures. Reviewed By: rshest Differential Revision: D72972921 fbshipit-source-id: 92ed112444cbc20daed5466ad20f651479bfac6fNicola Corti · cac27d15 · 2025-04-16
- 1.4ETVIntroduce V2 Perf Monitor feature flags (#52809) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/52809 **Context** Experimental V2 Performance Monitor prototype, beginning by bringing the [Interaction to Next Paint (INP)](https://web.dev/articles/inp) metric to React Native. **This diff** Add two new feature flags: - `fuseboxInteractionMetricsEnabled` — Will configure sending of interaction live metrics to CDP clients, independent of an active performance profiling session. - `perfMonitorV2Enabled` — Will enable the backend + UI for the V2 Perf Monitor. Changelog: [Internal] Reviewed By: motiz88 Differential Revision: D78894857 fbshipit-source-id: 7605357b3cc9255d76f66bde605f9e520dda9750Alex Hunt · a3e99264 · 2025-07-25
- 1.4ETVAdd feature flag to disable subview clipping (#54416) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/54416 See title Changelog: [Internal] Reviewed By: christophpurrer Differential Revision: D86262692 fbshipit-source-id: bf7fb2a45e33a0c6974af6138b3735cfeef1ae0cNick Lefever · 8123f319 · 2025-11-05
- 1.4ETVMigrate `ReactShadowNode` interface from Java to Kotlin (#56941) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56941 Migrate the `ReactShadowNode` interface from Java to Kotlin as part of the ongoing Kotlin migration effort. This is a mechanical conversion of a deprecated legacy architecture interface with no functional changes. The interface is a pure declaration with no default implementations. Changelog: [Android][Changed] - Migrate `ReactShadowNode` interface from Java to Kotlin Reviewed By: javache Differential Revision: D106079764 fbshipit-source-id: 4b220c791fb9b912877a9a8ef5a7152b8efa3a36Nicola Corti · f07c7cce · 2026-06-02
- 1.4ETVAdd LIS-based differentiator for minimal child reordering mutations (#56094) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56094 The current Differentiator Stage 4 uses a greedy two-pointer algorithm to reconcile reordered children. When children are shuffled, it produces excessive REMOVE+INSERT pairs because it doesn't find the minimal edit. This adds an alternative code path that uses Longest Increasing Subsequence (LIS) to identify which children can stay in place vs which need to be moved. Items in the LIS maintain their relative order — only items outside the LIS need REMOVE+INSERT. Example: moving last element to front [A,B,C,D,E] → [E,A,B,C,D]: - Greedy: 4 REMOVEs + 5 INSERTs = 9 mutations - LIS: LIS=[A,B,C,D], only E moves = 1 REMOVE + 1 INSERT = 2 mutations The LIS algorithm is O(n log n) time, O(n) space. Since average child count is <10, the position mapping uses linear scan instead of hash tables. Guarded by `useLISAlgorithmInDifferentiator` feature flag (default off). Changelog: [Internal] Reviewed By: sammy-SC Differential Revision: D96334873 fbshipit-source-id: a417d6b74a3195b3ff3cb98e76d4820073918c2bPieter De Baets · 44ac8c26 · 2026-03-16
- 1.3ETVExecute commands in order (#54074) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/54074 Currently, we dispatch view commands eagerly at the beginning of a batch. This behavior originated with https://github.com/facebook/react-native/commit/b54257c628b1a174a2c41960e7fc4d2d719ad731. However, this can make it difficult to allow developers to control mount item execution order. For example, someone may want to make sure a view command is processed *after* a particular mount item, and not exclusively rely on retryable command exceptions. This change sets up a feature flag to enable in-order execution of view command mount items. ## Changelog [Internal] Reviewed By: mdvacca, sammy-SC Differential Revision: D84061054 fbshipit-source-id: 7cb68c43823ed67f541f4e8f2d7471629609a905Eric Rozell · 8cc9bbc8 · 2025-10-09
- 1.3ETVConvert com.facebook.react.runtime.ReactHostImpl to Kotlin (#51017) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/51017 Changelog: [Internal] Reviewed By: rshest Differential Revision: D73846053 fbshipit-source-id: 98017000e8f10df4156b232bc8b5d6e132502ea5Pieter De Baets · 54133045 · 2025-05-12
- 1.3ETVMigrate `UIManagerModule` from Java to Kotlin (#56996) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56996 Migrate `UIManagerModule` from Java to Kotlin as part of the ongoing Kotlin migration effort. This is a mechanical conversion of a deprecated legacy module with no functional changes. Changelog: [Android][Changed] - Migrate `UIManagerModule` from Java to Kotlin Reviewed By: javache Differential Revision: D106080563 fbshipit-source-id: 2d0b21cc26c50e1e026b579e4adcee7e71a2be18Nicola Corti · 21dfc2a8 · 2026-06-02
- 1.3ETVExport unstable_VirtualView with iOS, Android implementations (#51980) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/51980 Changelog: [Internal] - Export unstable_VirtualView. This is currently experimental Reviewed By: mdvacca Differential Revision: D76471250 fbshipit-source-id: 107b82c9ac93b31d7e30ea3473e341788176cddeLuna Wei · f00b4494 · 2025-06-18
- 1.3ETVSync clipChildren with overflow: hidden (#55368) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/55368 Changelog: [Internal] We found an issue (T253147322) in the LivingRoom top bar where a full-screen OCPanel within a parent with `overflow: hidden` occludes content outside the parent (see [code](https://www.internalfb.com/code/fbsource/[753feac76cb1]/arvr/js/apps/LivingRoom/src/ReactNative/App/HTV/Shared/Toolbar/LivingRoomToolbar.react.js?lines=85-96)). This change adds a feature flag `enableClipChildrenForOverflowHidden` that, when enabled, sets `clipChildren = true` whenever `overflow: hidden` is set. This makes `TouchTargetHelper` also reject touches on children outside the parent's bounds (see [code](https://www.internalfb.com/code/fbsource/[753feac76cb1]/xplat/js/react-native-github/packages/react-native/ReactAndroid/src/main/java/com/facebook/react/uimanager/TouchTargetHelper.kt?lines=211-213)), aligning hit testing behavior with visual rendering. The fix is gated behind a feature flag to allow gradual rollout and prevent potential regressions in apps that may rely on the current behavior. Reviewed By: Abbondanzo Differential Revision: D91775635 fbshipit-source-id: a1bf9bbd7ea9ff71ac4e7cf407b6d5328272bf00Fabrizio Cucci · 1c8f297d · 2026-02-02
- 1.3ETVAdd Page.captureScreenshot CDP support (#56307) Summary: Pull Request resolved: https://github.com/facebook/react-native/pull/56307 Implement the `Page.captureScreenshot` CDP command in the inspector backend, allowing DevTools to capture an on-demand screenshot of the current app view. This is a minimal implementation supporting only the `format` (jpeg/png/webp) and `quality` (0-100, jpeg only) parameters, returning base64-encoded image data. The feature is gated behind a new `fuseboxCaptureScreenshotEnabled` React Native feature flag, wired through `InspectorFlags` following the same pattern as frame recording. **Motivation** Improve agent verification / user feedback during AI sessions. We've proven that screenshots (in performance traces) are useful for understanding how components render on screen, and exposing this as an on-demand CDP method is relatively cheap today vs the larger task of modelling the DOM (Elements panel). **Changes** - New `fuseboxCaptureScreenshotEnabled` feature flag + `InspectorFlags` wiring (C++, Android JNI, Kotlin) - `HostTargetDelegate::captureScreenshot()` virtual method with async callback - C++ CDP handler in `HostAgent` — parses `format`/`quality`, delegates to platform, sends async CDP response (gated by flag) - iOS (`RCTHost.mm`): Captures key window via `UIGraphicsImageRenderer` + `drawViewHierarchyInRect`, encodes to PNG/JPEG - Android (`ReactHostImpl.kt`): Captures decor view via `Bitmap` + `Canvas` + `View.draw()`, encodes to PNG/JPEG/WebP - 4 C++ tests: success, failure, param forwarding, flag-disabled rejection Changelog: [Internal] Reviewed By: hoxyq Differential Revision: D99099930 fbshipit-source-id: d4d2ef86ba20d2ee230903e152dd21e11f29cbb8Alex Hunt · 77332d27 · 2026-04-08