Repository navigation
React Native macOS 0.83–0.87: PR stack and release tracker #3098
Description
Stack at a glance
Read left to right. Arrows show ancestry with intermediate commits collapsed; the green boxes are release branches. Publication follows 0.83 → 0.84 → 0.85 → 0.86 → 0.87.
flowchart LR
shared["Shared fixes<br/>#3099"] --> m84["0.84 mainline<br/>#3030"]
m84 --> m85["0.85 mainline<br/>#3033"]
m85 --> redbox["RedBox + AppKit<br/>#3058 → #3054"]
redbox --> m86["0.86 mainline<br/>#3035"]
m86 --> m87["0.87 mainline<br/>#3037"]
base83["0.83-stable"] --> r83["0.83.0<br/>#3022"]
m84 --> r84["0.84.0<br/>#3031"]
m85 --> r85["0.85.0<br/>#3034"]
m86 --> r86["0.86.0<br/>#3036"]
m87 --> r87["0.87.0<br/>#3107 · detail below"]
classDef mainline fill:#dbeafe,stroke:#2563eb,color:#111827
classDef release fill:#dcfce7,stroke:#16a34a,color:#111827
class shared,m84,m85,redbox,m86,m87 mainline
class r83,r84,r85,r86,r87 release
The next minor descends from the preceding mainline, rather than its release branch. The 0.83 release line is separate. Documentation #3038 branches from #3037.
Merge and release order
This tracker records the intended order for React Native macOS 0.83–0.87. Checkboxes indicate merged PRs.
All active implementation PRs are open. The 0.87 portion now follows one first-parent path.
Shared fixes and 0.83
- 1. fix(macos): forward-port shared release fixes to main #3099 — Shared fixes →
main. Forward-port reusable 0.83 fixes for CI, publication, packages, types, Hermes, CocoaPods, and RedBox. - 2. chore(0.83): prepare stable 0.83.0 with React Native 0.83.10 #3022 — 0.83 release. Prepare RNM 0.83.0, compatible with RN 0.83.10.
- Release checkpoint: Publish and verify 0.83.0.
0.84
- 3. feat: merge
0.84-mergeinto main #3030 — 0.84 mainline merge. Merge the React Native 0.84 fork point after the shared fixes. - 4. chore(0.84): prepare stable 0.84.0 with React Native 0.84.1 #3031 — 0.84 release. Prepare RNM 0.84.0, compatible with RN 0.84.1.
- Release checkpoint: Publish and verify 0.84.0.
0.85 and RedBox
- 5. feat: merge
0.85-mergeinto 0.84-merge #3033 — 0.85 mainline merge. Merge the React Native 0.85 fork point. - 6. chore(0.85): prepare stable 0.85.0 with React Native 0.85.3 #3034 — 0.85 release. Prepare RNM 0.85.0, compatible with RN 0.85.3.
- Release checkpoint: Publish and verify 0.85.0.
- 7. feat(macos): merge React Native through the RedBox 2.0 cutoff #3058 — RedBox upstream cutoff. Merge upstream changes through the RedBox 2.0 cutoff.
- 8. feat(macos): port RedBox 2.0 to AppKit via RCTUIKit compatibility primitives #3054 — RedBox AppKit port. Port RedBox 2.0 to AppKit. Keep V1 as the default and V2 behind the native opt-in.
0.86
- 9. feat: merge
0.86-mergeinto 0.85-merge #3035 — 0.86 mainline merge. Merge the React Native 0.86 fork point after the RedBox layers. - 10. chore(0.86): prepare stable 0.86.0 with React Native 0.86.3 #3036 — 0.86 release. Prepare RNM 0.86.0, compatible with RN 0.86.3.
- Release checkpoint: Publish and verify 0.86.0.
0.87 — one linear stack
Re-stack complete: active branch heads, jj bookmarks, and PR bases are updated and verified in this order. Existing PR numbers are retained.
- 11. chore: merge React Native 0.87 fork point #3037 — 0.87 mainline merge. React Native 0.87 fork point.
- 12. feat(0.87): add focused Apple header and SwiftPM foundations #3104 — Apple foundations. Canonical public API, Metro, Apple headers, and SwiftPM foundation.
- 13. fix(0.87): integrate focused Apple artifacts and runtime compatibility #3105 — Fork integration. Focused artifact, type, runtime, and validation changes.
- 14. fix(interop): preserve the legacy view manager removal guard #3106 — Interop headers. Preserve the legacy interop guard after integration.
- 15. chore(0.87): sync upstream 0.87.1 and prepare the release branch #3100 — Upstream 0.87.1 stable sync. Release-line prerequisite, compatibility changes, locks, and generated artifacts.
- 16. test(hermes): cover branch metadata snapshot URL resolution #3101 — Hermes metadata regression coverage. Snapshot URL resolution tests.
- 17. chore(0.87): integrate and prepare stable 0.87.0 #3107 — Stable 0.87.0 release. Prepare RNM 0.87.0, compatible with RN 0.87.1.
- Release checkpoint: Publish and verify 0.87.0.
flowchart LR
fork["0.87 mainline<br/>#3037"] --> foundation["Apple foundations<br/>#3104"]
foundation --> integration["Integration + headers<br/>#3105"]
integration --> interop["Interop<br/>#3106"]
interop --> sync["Upstream 0.87.1<br/>#3100"]
sync --> hermes["Hermes tests<br/>#3101"]
hermes --> release["0.87.0 release<br/>#3107"]
classDef mainline fill:#dbeafe,stroke:#2563eb,color:#111827
classDef feature fill:#ede9fe,stroke:#7c3aed,color:#111827
classDef preparation fill:#fef3c7,stroke:#d97706,color:#111827
classDef stable fill:#dcfce7,stroke:#16a34a,color:#111827
class fork mainline
class foundation,integration,interop feature
class sync,hermes preparation
class release stable
Reusable features precede stable-release preparation. The topology-only final release tree was byte-identical to the original candidate; separately reviewed and validated CI repairs are now included. Stable releases #3022, #3031, #3034, and #3036 keep their earlier separate release branches and checkpoints.
Consolidated header reviews: #3102 and #3103 are closed as superseded by #3105. Their complete implementations remain included; the original branches and review history are preserved.
Documentation
- docs: add minor merge and release skill #3038 — Document the minor merge and release process. Depends on the 0.87 merge branch.
Validation and follow-up
The reviewed repair packet passed 1,406 release-helper tests across the 18 active heads. Both changed linear RC checkpoints passed separate immutable installs, constraints, graph, packing, and helper checks. All 27 active remote destinations and same-remote backups were verified under backup/pre-ci-repair-20260922/<original-branch>. Final current-head CI acceptance is recorded below.
Local release validation includes five exact-peer clean consumers, 56 consumer checks, ten verified tarball hashes, and five read-only publication previews.
Native and API validation retains its recorded source-tree scope; it does not imply that every build ran at every final commit.
The 2026-09-21 synchronization verified 24 remote destinations and 15 same-repository backups.
Backup branches use backup/pre-release-sync-20260921-1447/<original-branch>.
- Correct public-registry lock metadata. All 18 hosted generation/immutable/constraints/audit jobs passed in run 35769816507. The independently reviewed correction contains only 792 equivalent executable-path prefix changes; dependency versions, checksums, ranges, source files, and the linear stack are unchanged. All 27 updated destinations and their
backup/pre-public-registry-20260922/…backups are verified. - Clear GitHub's stale conflict reports for chore(0.84): prepare stable 0.84.0 with React Native 0.84.1 #3031, chore(0.85): prepare stable 0.85.0 with React Native 0.85.3 #3034, feat: merge
0.86-mergeinto 0.85-merge #3035, and docs: add minor merge and release skill #3038. All four report mergeable after a base refresh; original bases and heads were preserved. - Post current-source replies to all six older chore(0.83): prepare stable 0.83.0 with React Native 0.83.10 #3022 review threads (Changesets base, version export, test-app/init forward-ports, frame observer scope, and DevLoadingView applicability). Reviewer resolution/approval remains pending.
- Complete current-head CI acceptance for all 18 active PRs.
- Reviewer/owner: resolve remaining review threads and approve the submitted heads before merging.
- Owner: configure the GitHub
npm-publishenvironment and confirm both npm Trusted Publisher configurations. A fresh environment query still lists onlycopilotandgithub-pages.
These CI observations describe the initial post-push snapshot. Each PR's current Checks tab remains authoritative.
Completed CI follow-up
- The independently reviewed follow-up is committed and pushed: 16 heads / 25 destinations, with same-repository backups under
backup/pre-ci-followup-20260922/<original-branch>. - The combined packet passed 92 validation commands, including 12 API revalidations/generated TypeScript checks, full formatting checks, and 124 targeted suites / 3,076 tests.
- Corrections include generated API snapshots, branch-specific Hermes fixtures, deterministic generation of the eight native-spec headers used by the inventory test, scoped formatting, feat(0.87): add focused Apple header and SwiftPM foundations #3104's sidecar copy, and feat: merge
0.85-mergeinto 0.84-merge #3033's destination guards. Public-registry locks and package manifests remain exact. - Stable 0.85/0.86 retain their already-passing source trees; new commits preserve corrected predecessor ancestry. Main fix(macos): forward-port shared release fixes to main #3099 and stable 0.83 chore(0.83): prepare stable 0.83.0 with React Native 0.83.10 #3022 remain at their green heads.
- fix(interop): preserve the legacy view manager removal guard #3106's one job-specific CMake retry passed the actual iOS-dynamic RNTester build.
- All six older chore(0.83): prepare stable 0.83.0 with React Native 0.83.10 #3022 review threads now have current-source replies. Reviewer resolution and approval remain owner-controlled.
Current release heads: 0.83 88195ce7d609, 0.84 959a063f7bfa, 0.85 5162d0eab630, 0.86 33dc11c33805, 0.87 1a9971c257ba.
The subsequent Flow/lint correction is also committed and pushed: five source repairs and three tree-identical ancestry caps, with all 14 destinations and backup/pre-flow-lint-20260922/… backups verified. Full Flow, ESLint, and formatting passed; API declarations, generated outputs, package versions and locks are preserved.
Fresh CI acceptance is complete for all 18 recorded heads. No PR merges or npm publications have occurred.
Final technical acceptance
All 18 expected current-head CI check sets passed at 2026-09-23 02:34:29 UTC, with no failed or pending checks in the completed observer snapshot. Source corrections, generated snapshots, fixture/format repairs, public-registry metadata, review replies, guarded pushes, and the linear jj/PR stack are complete.
The remaining steps are owner/reviewer actions: review resolution and approval, merge in order, configure/verify npm-publish and both npm Trusted Publishers, publish 0.83.0 through 0.87.0 in order, then verify each published release before continuing. No PR merges or npm publication have been performed by this task.
Potential Meta upstream contributions
Track RNM-local fixes that are generic enough to propose to facebook/react-native. Keep the RNM diff tags until the corresponding Meta change is included through a later fork point.
#3099 — shared forward fixes
Strong candidates
-
a9765212— match codegen source globs against package-relative paths. Generic codegen build bug: absolute checkout ancestors such as hidden or__tests__directories can misclassify the entire package. Current Metamainstill matches absolute paths. -
2b97335f— resolve the ReactNativeDependencies package fallback correctly. Generic out-of-tree CocoaPods package-root correction. -
07921f8b— return a failing status for invalid prebuild platforms. Generic CLI correctness; current Metamainstill prints the error and returns without setting a nonzero exit status. -
b18a9d38— use the canonical HostPlatformColor header import. Generic framework/header-map correctness. -
0b1306dd— link CoreGraphics from the graphics pod anda9e5b9e8— link it from the sample native module. Direct framework ownership rather than transitive linkage.
Candidates needing upstream design review
-
87adb52c— canonicalize checkout-relative package imports in API Extractor output. Generic monorepo/API snapshot problem, but Meta may prefer integrating the fix into the existing pre-extractorrewriteLocalImportspipeline rather than adding a post-rollup transform. -
3c658c0e— derive dynamic framework header paths throughadd_dependency. Generic CocoaPods dynamic-framework improvement; rebase against current Meta podspec structure first. -
ff90a9b6— preserve canonical platform headers in frameworks. Useful cross-platform header dispatch pattern, but current Metamainhas evolved its framework layout and needs a fresh design. -
f741b50d— resolve private workspace dependencies during public API generation. Potentially generic for monorepo type generation; confirm Meta's current private/public workspace contract.
Already upstream
-
584cfd3a— preserve explicit custom font weights. Already fixed upstream by React Native Fix custom font weight rendering heaviest face on iOS Fabric react/react-native#57483 (3e5e3c29ba48); keep locally only until the containing fork point lands.
Other stack PRs
- Review each PR for additional Meta candidates as its local review completes.
Release rules
- Merge the shared fixes into
mainbefore the upgrade PRs. - Retarget dependent PRs as their predecessors merge.
- Keep release branches separate from the next minor's mainline ancestry.
- Publish 0.83.0 → 0.84.0 → 0.85.0 → 0.86.0 → 0.87.0.
- Verify each publication before the next release.
- Use Changesets and GitHub trusted publishing. Publish virtualized-lists before core, with exactly one dist-tag per package upload.
- Recalculate tags from the current registry state. Skip already-published versions without tag mutation.
Activity
chore(0.83): prepare stable 0.83.0 with React Native 0.83.10 (#3022)
sethwebster commentedon Oct 10, 2026
Hi Saad, some independent validation of this stack from the Expo side.
I merged React Native
v0.88.0-rc.4on top of the 0.87 stack tip (#3107,1a9971c257). There were 181 conflicts, nearly all where the 0.87 stack had backported upstream SwiftPM/prebuild work that 0.88 now ships itself.On the result:
build-types --validate, feature flags, the C++ API snapshots and the Ruby tests pass.Downstream, an Expo SDK 58 desktop app builds and runs on tarballs packed from it. The stack held up very well, and I'd love to see it merged and published.
Two PRs against your
0.87/releasebranch, in case they're useful:RNTesterList.macos.jsre-exports the iOS list, whoseTextInputExample/TestLibraryExamplerequires have no macOS variant, so the macOS bundle fails to resolve.For context: Expo SDK 55 and later sit on React Native 0.83 and newer. Expo's macOS code paths need react-native-macos 0.84 or later to drop their pre-0.84 workarounds, so publishing 0.84 and beyond unblocks Expo on macOS. Happy to help test release candidates.