Tracking document for the Meta React Native changes selectively synchronized
into this fork's main (React Native macOS 0.87).
fork.md remains the source of truth for the Microsoft React Native macOS
baseline and every macOS-specific local patch. This document is deliberately
separate: it records changes sourced directly from Meta before Microsoft has
merged them, so the two upstream histories never get conflated.
| Source | Remote | Branch | Commit |
|---|---|---|---|
| Local fork last functional tip | — | main |
f843e0d16764cf58ee2704857f20fac81dda7005 |
| Microsoft macOS baseline | upstream |
0.87-merge |
d8c588e4a67cbe9d3cdebb27a8909a93448807cd |
| Meta React Native stable | react-native |
0.87-stable |
b8d50a9dff21954d1c00f7be778de31ec49fb83d |
| Meta React Native main (sync snapshot) | react-native |
main |
4338af051488 |
| Shared merge base | — | — | ce057d6554b5ed44070336fa2353d7d6624eab92 |
Snapshot taken 2026-08-18:
git rev-list --left-right --count \
upstream/0.87-merge...react-native/0.87-stable
# 79 62 (Microsoft-only, Meta-only)The counts measure different platform integration histories, not quality or priority. Never merge the branch wholesale.
| Meta commit | Status | Local commit | Intent / verification |
|---|---|---|---|
65c816879c |
applied — verification blocked | e0a118d379 |
Fix parentNode for nested Modal/portal roots. git apply --check passed; the source integration test needs @react-native/fantom, which this fork checkout does not provide. Run it after restoring the Fantom test environment, plus a macOS Modal focus/blur capture-and-bubble acceptance check. |
79de55fbf5 |
applied — verification blocked | e615acfbf5 |
Harden window and navigator descriptors in the JS runtime. The associated integration test also depends on the absent Fantom environment. |
330080c46b |
applied — verification blocked | 7bce075286 |
Make inspector tracing state move-only for Swift C++ interop and update C++ API snapshots. cxx-api-validate cannot run: the checkout lacks Python doxmlparser; rerun it in the documented toolchain. |
8fffb64288 |
applied — verification blocked | 3e72f8bd77 |
Use framework-style import for RNTester Fabric component plugins. Validate in an RNTester macOS build. |
3ece12505b, e730105453 |
applied | 24915b8f85, 6499e71ed2 |
Remove deprecated Jest-preset and polyfills subpath redirects. |
85d24122f5, 6c5b9b1ae0, 9b76007ae0, 7dcf5de123, cc77834b28 |
applied — validation blocked | 0a081311c5, 9eaf09671c, 602f22300a, f264b7ca1e, c89e9ad544 |
Adopt react-native/setup-env and keep it graph-reachable; validate a Metro app launch. |
f1cfad0197, 0b70d7c95f, d4f22ae63d, e2d6d3230b, d6baa433cb |
applied — passes generated type test | 1be1b98109, 2e026d56d1, 824f66a9f4, 084afb2f44, 63a5c02e83 |
Adopt Meta's public API removals and Strict TS API. The nested workspace had resolved react-native to the parent project's installed package, so React.ComponentRef crossed incompatible React declaration graphs and became never. Map the typetest's react-native import to this checkout's types_generated/index.d.ts; test-generated-typescript now passes. |
d7288bd6a7, 9a7b821a02, f3e11c2557, 31cf29a5b3 |
applied — validation blocked | a38fa0ed02, cd6862f59a, e84d89450d, d277e7ac23 |
Fix HelloWorld Jest preset, exact optional generated types, extensionless scripts imports and SceneTracker removal. Generated API snapshot was rebuilt for macOS patches. |
4dd4d31458 |
already covered | — | The OTHER_CPLUSPLUSFLAGS module-map behavior is already present in the local rncore.rb refactor; do not duplicate it. |
17f7849e0d, 8959ebd91d, e325575445, fd653cb9f3, a556d97ed7, 8a35e69faf, 034245a015, 24353daa87 |
deferred by policy | — | Prebuild/Core/Hermes architecture is stable locally; retain it and do not migrate to ReactNativeHeaders/VFS changes. |
486df8d410, 6e2ca18cea, f07a030b2b, 0cacb90bc0, d8b52df809, 329f8640bf, b8d50a9dff |
deferred by policy | — | SwiftPM changes will be evaluated only after the non-SwiftPM upstream sync is complete. |
Ray's 2026-08-19 decision: cherry-pick the useful main commits identified in
the audit; do not follow 0.87-stable..main wholesale (package.json on main
is 1000.0.0). Sync snapshot: react-native/main 4338af051488 is 357
commits ahead of 0.87-stable. That snapshot is the fork's recorded pick
window; later main movement is out of this document until a new pass.
| Meta commit | Status | Local commit | Intent / verification |
|---|---|---|---|
0a60ec9dea |
applied | 4c8f23967a |
Decimal transformOrigin tokens. |
4501979c1a |
applied — ported | af6e241eb1 |
Negative transformOrigin tokens. Regex + tests ported onto the already-picked decimal parser. |
092734772a |
applied | 3d71a02af2 |
normalize-color LRU cache. Auto-merged onto the local oklch/oklab parser. |
66f27eb93e |
applied | d1b8e3e38d |
Keep radial-gradient position after an explicit size. |
5821fcaf5d |
applied | 5d0d23c7a8 |
Reject percentage radius for circle radial gradients. |
26eb36c657 |
applied — ported | 7cc433b7b4 |
PlatformColor native raw fallback. Kept RCTPlatformColor / macOS color-map; added OrNil. |
65008fcdd0 |
applied — ported | 08bc4478de |
PlatformColor(..., {fallback}) JS. Also wired PlatformColorValueTypes.macos.js (Meta shipped ios/android only). Some ios/android JS files landed in af6e241eb1. |
85e07db3e8 |
applied — verification blocked | 30266d4643 |
PlatformColor fallback Fantom / CSSColor tests. Need Fantom. |
31e119a2a1 |
applied | 17db3a0602 |
PlatformColor lint rule + RNTester example. |
711a9a5e07 |
applied | b599c166c1 |
Reset EmptyLayoutMetrics on Fabric view recycle. |
2b992a0d4b |
applied | 047ebb43da |
Flush created animated nodes before handling events. |
42be7452d5 |
applied | b8eba2c306 |
Codegen infinite loop on aliases that shadow CodegenTypes members. |
4bf5575490 |
applied | 18ddb67e34 |
Codegen'd TurboModule event emitters no-op without a callback. |
c467843ed0 |
applied | 95f6156d87 |
DOMHighResTimeStamp round-trip truncation. |
433e79d2f4 |
applied — ported | f8224e9106 |
Touch-handler RCTAssert → RCTLogWarn. Kept macOS eventNumber map. |
5cb65244dc |
applied — ported | 230e0df08e / 9ae58a7d38 |
Clamp pendingScrollUpdateCount for rapid prepends. Production landed first; the #53542 Jest regression was added next to this fork's existing MVCP tests (Meta's inverted-prepend fixture is not in this file). |
8415753e21 |
applied — macOS shim | 43a4d6569d / be9f567c4a |
Apple text layout variable-font / variation axes. Meta uses UIFontDescriptorAttributeName; be9f567c4a aliases that to NSFontDescriptorAttributeName in RCTUIKit or Debug Core fails in RCTFontUtils.mm. |
376b99ff14 |
applied — ported | a714dbf339 |
Object fontVariationSettings. Processor and view-config files landed with f8224e9106; d.ts in this commit. Skip Android TextInput a688608090. |
7844386bbd |
applied — ported | 738acc805c |
Graduate backgroundSize/Position/Repeat. Keep experimental_* aliases. Skip conflicting ReactNativeApi.d.ts / Android Kotlin. |
e7bb11ae16 |
applied | 0f88283bfc |
RNTester ArrayBuffer bridging header. |
5e86c323ce |
applied | 60e2387aed |
JS→ObjC ArrayBuffer args as NSData (intermediate before RCTArrayBuffer). |
11f9a7f449 |
applied — ported | c69eb331e1 |
RCTArrayBuffer zero-copy ObjC TM class. Kept macOS RCT_EXPORT_METHOD on RCTSampleTurboModule; codegen/C++ snapshots take the new type. Breaking for ObjC TM authors: ArrayBuffer is now RCTArrayBuffer *, not NSData */NSMutableData *. |
19f7d144b9 |
applied — C++ only | 90b4632c1f |
Shared Fabric TextAttributes / BaseTextProps / measure-cache for fontVariationSettings. Android Java/Kotlin left out. Apple 8415753e21 already consumed this field. |
a688608090 |
skipped — Android-only | — | TextInput fontVariationSettings on Android. Apple path is covered by 8415753e21 + 376b99ff14 + the C++ field from 19f7d144b9. |
5421c5eb37 |
applied | 26c78a1b69 |
Flex-growing content sizing in ScrollView. |
9160010d1f |
applied | dff2d29915 |
ScrollView recycled content inset. |
5306e9229c |
applied | 88a1837297 |
ListItemComponent TypeScript prop. |
1291d7ce8e |
applied — ported | 297c722f4c / e06759da6b |
Bounds-safe unmountChildComponentView assert. Follow-up uses RCTUIView instead of UIView in the index assert. |
3b5d0a6526 |
applied | 956bf784d2 |
extralight in RCTGetFontWeight. |
5e40a1771e |
applied | 17942cd7d4 |
Pixel-grid rounding no longer clips text. |
0a1a06c5ea |
applied | e0a9549f95 |
requestIdleCallback timeout assignment. |
aa96fa64d1 |
applied | e42e00f1a6 |
AccessibilityRole list conversion. |
2ce2c0794b |
applied | cc1a8ac496 |
Remove accidental ref-callback return values. |
e71fc4e32f |
applied | 5d126b065f |
RCTDevSettings init. |
0b0eb8d012 |
applied | 1dc9347250 |
Empty ReactCodegen input_files when no Native specs. |
7f18ad0f84 |
applied | 7d2436d11c |
Ellipsize single-line TextInput placeholders (Android files; Apple path unchanged). |
5976273f1c |
applied | 7eeba936eb |
Shadow-node ref update thread tag at Fabric install. |
1b92b02f99 |
applied | 247cf7141b |
Default RTL text alignment. |
eb4d3892ab |
applied | d132562b2c |
Shadow-without-background log advice. |
b587763f40 |
applied | 7028c242e3 |
Pause RedBox auto-retry while backgrounded. |
e59a1d252c |
applied — ported | dc4e727f8e |
Invalidate list content length on orientation change. Also clear cell metrics on horizontal flip. |
1c4a46f4e3 |
applied — ported | dc4e727f8e |
Ignore stale minimumViewTime viewability callbacks. |
100f8fc4fd |
applied — C++ only | dc4e727f8e |
Derive accessibilityTraits from role+state in one writer. Left macOS RCTViewComponentView trait writers in place. |
918fb15bfe |
applied — ported | fef6d15239 |
Custom font + fontWeight no longer resolves to heaviest face. |
56c284e152 |
applied — ported | fef6d15239 / e06759da6b |
Copy tintColor when swapping TextInput backing views. Follow-up keeps the copy iOS-only (NSView has no tintColor). |
4043e818f1 |
applied — ported | a018ac25bc |
role implies accessible on View/Image (Image.macos.js re-exports iOS). |
3eab03df4c, 3eb330a365 |
applied — ported | 8dd91d34de |
Animated addListener / event() source types. Skip ReactNativeApi.d.ts. |
0dec9e275e |
applied | 03c17fef16 |
Yoga sentinel upcast UB. |
3e962d3800 |
applied | 488dccc2cd |
Guard shrink-factor division near zero. |
7fa49077c8 |
applied | f386cda2a2 |
Event.cancelBubble + LegacySyntheticEvent. |
49f0db4394 |
applied | 130fdd080b |
Guard forced-native animations from JS updates. |
88820254e5 |
applied | 8e2b91afdb |
Align ref-helper Flow types. |
471c612b57 |
applied | 3ae672d35f |
Construct shared animation backend after UIManager has a delegate. |
85a81818c6 |
applied | 0d872f5c0c |
Avoid copying surface props on start/update. |
fff4994af8 |
applied | 023b756e0a |
Harden on-demand JS segment load when the cache file is missing. |
58bf844967 |
applied | 66e4867336 |
XMLHttpRequest.setRequestHeader appends duplicate headers. |
c086431a4b |
applied | ef103ce761 |
requestIdleCallback / cancelIdleCallback TypeScript declarations. |
5906cfb060 |
applied — ported, Apple only | 78484def44 |
Length-aware string conversion so \0 no longer truncates Text. Skip Android JavaTurboModule. |
b743a8a35b |
applied — ported | c38d292d50 |
Refresh cached DeviceInfo constants on resize. Kept macOS window-frame observers. |
568eaa6b69 |
applied — ported | 3d91fe3dc8 |
FileReader retains the Blob until the native read settles. This fork has no _readId; ported onto _aborted. |
917d97eb12 |
applied — ported, production only | df1d0ff803 |
iOS codegen still crawls libraries with no ios config. Jest fixture still conflicts. |
3f8f5c216a |
applied | a5b8b93318 |
Missing <mutex> in HostTarget.h. |
857c3d24c1 |
applied | f190e692c0 |
NativeMap/Array internal symbol visibility. |
5fb3ebce1a, 5bb9639594, d84c13d511 |
skipped — Android-only | — | Java / JArrayBuffer TurboModule stack. |
e0aa7a8b0a, 0f1bdddfb3, 00a5aa9223, 507023622b |
skipped — no desktop analog | — | Software-keyboard inset recycle, Fabric keyboardType reload, CarPlay RCTAppearance, numeric return-key accessory. |
05b97de823, 8e995e8dac |
applied — macOS analog | b691d36eb5 |
iOS Full Keyboard Access uses canBecomeFocused. macOS analog: acceptsFirstResponder also honors interactive role / accessibilityRole. needsPanelToBecomeKey stays false so mouse clicks do not steal focus. |
f2188610c6 |
already covered | — | tvOS viewToFocus. macOS TextInput / View already makeFirstResponder in their own focus/blur. |
22cfb5caec, db11646c94, db662caead, 6d34b7aaff, 4bf9d4e9b0, 1492a6080f, 190e16cc32, 942d07bc19, 7115c2b97e, ee56f1e1f6, a3f20d888c, d2dfb47c1e |
skipped — RCT_EXPORT_METHOD drop |
— | Sample + core module export-macro cleanup. Local sample still uses the macros. |
3f3425e246 |
skipped — macos Modal patched | — | Remove NativeModalManager. |
b67b7ba621 |
already covered | — | Duplicate ScrollView Fabric subspec already commented out locally. |
c3caea9b5e |
skipped — ios Image only | — | Extract Image.ios.js props once. Image.macos.js re-exports Image.ios.js; picking later would cover macOS without a second file. |
385fa84925, 5e11ed122a |
deferred by policy | — | C++ stable-API guards + ios-prebuild header inventory. |
b74adf051f |
deferred | — | Idle-frame Performance timeline (inspector / cxx-api snapshots). |
55195ca43f, e55da68478 |
deferred | — | Layout event emitter + shadowTreeDidCommit hook. New C++ surface, no consumer yet. |
11dc60c300, afc165129e |
deferred | — | Require NativePerformance and drop the JS fallback. |
7cdac2a15c |
deferred | — | Relocate manual .d.ts under types_DEPRECATED/. |
40c06121a1, f63b2a1cb5 |
deferred | — | Babel Platform inlining. |
146aaac7ee, 41b375eb04, 50a35dbc7d, 19f7d144b9 |
skipped — Android-only | — | NaN border widths, JS exception extra-data abort, Overflow.fromString, Android font variation. |
When a queued change is accepted, replace its status with applied, record the
new local SHA, and state the exact validation that passed. If a required test
environment is absent, write verification blocked and the unambiguous
follow-up test rather than claiming a green result. Rejected changes remain
listed with a short reason; do not silently remove their audit trail.
Ray's 2026-08-18 decision: accept the Meta public API breaks and migrate workspace consumers; retain the proven local Core/Hermes prebuild architecture; defer SwiftPM-versus-CocoaPods evaluation until the rest of this upstream sync is complete.
Ray's 2026-08-19 decision: cherry-pick the useful post-0.87 main commits
listed above; keep prebuild/SwiftPM/Android-only/release bookkeeping out.
| Meta commits | Change | Recorded policy |
|---|---|---|
3ece12505b, e730105453, f1cfad0197, 0b70d7c95f, d6baa433cb |
Remove deprecated public entry points and make Strict TS API default. | Applied; workspace consumers must migrate. |
85d24122f5, 6c5b9b1ae0, 9b76007ae0, 7dcf5de123, cc77834b28 |
Replace InitializeCore reachability with the react-native/setup-env module graph. |
Applied; validate Metro bootstrap. |
| Prebuild and SwiftPM groups above | Change prebuild architecture or enable SwiftPM support. | Deferred; do not cherry-pick during this pass. |
Release tags, lockfile bumps, release CI and post-publish workflow commits are release bookkeeping, not fork runtime changes; they are recorded as skipped and will not be cherry-picked.
# Configure once, then refresh the Meta release line.
git remote add react-native https://github.com/facebook/react-native.git
git fetch react-native
# Check the two sources before assessing candidates.
git rev-parse upstream/0.87-merge react-native/0.87-stable
git merge-base upstream/0.87-merge react-native/0.87-stable
git rev-list --left-right --count \
upstream/0.87-merge...react-native/0.87-stable
git log --oneline upstream/0.87-merge..react-native/0.87-stable
# A candidate must apply cleanly before it is considered for integration.
git show --format= <meta-sha> | git apply --checkSelective cherry-pick is correct for this fork: Meta's branch contains iOS,
prebuild, SwiftPM and release changes that must not be imported wholesale into
the macOS production line. It does not prevent later comparison, but a
conflict-resolved pick receives a new SHA and may no longer be recognized by
patch-equivalence commands such as git cherry.
The table above is therefore the authoritative source-to-local mapping for
this first sync. For future accepted commits, use git cherry-pick -x <meta-sha> so the local commit also carries the upstream SHA in its message;
keep the table updated when a conflict changes the patch materially. Compare
future candidates against the Meta source ref, then exclude table entries and
use git log --cherry-pick --right-only HEAD...react-native/0.87-stable only
as a candidate heuristic—not as the record of applied work.
For every selected change:
- Read its code and tests; classify it as shared runtime, iOS/prebuild, SwiftPM, JavaScript toolchain, or release metadata.
- Check overlap with the macOS fork patches recorded in
fork.md. - Apply only one logical upstream fix at a time, retain/port its test, and validate the affected macOS production path.
- Update this table in the same local follow-up commit before proceeding to the next candidate.
Do not submit changes upstream from this fork. This is a local compatibility and delivery record.