React and React Native Weekly: Shopify Leaves React Native, React 19.3 Ships (Sep 14, 2026)

Shopify is moving its mobile apps back to Swift and Kotlin, React 19.3 makes View Transitions and Fragment Refs stable, RN 0.88 hits RC, and Expo Modules 2.0 drops the DSL.

React and React Native Weekly: Shopify Leaves React Native, React 19.3 Ships (Sep 14, 2026)

On Wednesday the React team shipped 19.3 and made View Transitions stable. On Thursday Shopify published a post saying it is moving every mobile app off React Native and back to Swift and Kotlin. One of those is a release. The other is the most interesting thing that has happened to this ecosystem in years, and it is not for the reason most people are arguing about.

Here is what mattered in React and React Native for September 7 to 13, 2026.

News

Shopify is going back to native

Shopify’s September 10 post is short and unusually direct. They adopted React Native in 2020. In January 2025 they published a piece saying they were doubling down. Now they are migrating everything to Swift and Kotlin. The Shop app is already done, proof of concept to shipped in the stores in twelve weeks. The main Shopify app, 300-plus screens plus widgets, a Watch app and Siri Shortcuts, is underway.

The reason they give is the part worth reading twice. It is not performance. It is not the New Architecture. Their argument is that coding agents now do enough of the implementation, translation, testing and review work that writing a feature twice no longer costs what it cost in 2020, so the single biggest reason to share a codebase has shrunk. Whether you buy that or not, notice what it implies: cross-platform frameworks have always been sold on engineering economics, not on output quality, and the economics just moved under everybody’s feet.

My honest take, having shipped React Native apps since the 0.5x days: this is a Shopify-shaped decision, not an industry verdict. Shopify has hundreds of mobile engineers, two enormous first-party apps, and platform teams who can absorb a rewrite. If you are eight people shipping to two stores, “build it twice, the agents will help” is a very different sentence. But the smugness in some of the replies this week is misplaced. Shopify were among the most credible React Native users in the world. When your best reference customer leaves, you ask why, you do not explain to them why they are wrong.

The part that actually affects your package.json is the open source fallout. Shopify maintains three libraries a lot of us ship:

  • React Native Skia: sponsored through the end of 2026. William Candillon, who created it, will fork the repo in the coming months and publish it under a new name. The Shopify repo gets archived once that transition is complete.
  • FlashList: roughly 2 million downloads a week. Shopify will fix critical compatibility breaks and is in active talks to hand long-term stewardship to another organisation.
  • Restyle: archived. Works through the end of 2026, then maintenance stops. Fork it if you depend on it.

Nothing breaks this week. Skia is at 2.11.2 with over a million weekly downloads and a maintainer who is not going anywhere, just changing the label on the box. But put a calendar reminder on Q1 2027 to check what your lockfile is pointing at. We wrote up the practical version in our Skia guide on Wednesday.

Expo Modules 2.0: the DSL goes away

Tomasz Sapeta’s September 8 post previews the next Expo Modules API, and it is the good kind of rewrite: less to learn, not more. Today you describe your module in a purpose-built DSL. In 2.0 a module is an annotated Swift or Kotlin class, ordinary methods and properties with a handful of annotations on the ones you expose to JavaScript. Expo claims up to 5.6x faster calls on top of that. The Swift macros are already in SDK 57, so iOS modules, functions, records, shared objects and events can be tried now. Views are not covered yet and Android follows later.

If you have ever written a native module, you know the DSL was never the hard part but it was the part that made your module look nothing like the rest of your native codebase. Removing it is how you get iOS engineers to review your bridge code.

Releases

React 19.3 makes View Transitions and Fragment Refs stable

React 19.3 landed on September 9. Two experimental APIs from last year’s Labs post graduated.

<ViewTransition> wraps a subtree and animates it when a Transition changes it: enter, exit, update, and share for a named transition that disappears in one place and reappears in another. Updates outside startTransition do not animate, which is the right default. addTransitionType lets you label the cause of an update so the same state change can animate differently going forward versus backward through a carousel. It composes with Suspense, so a boundary can cross-fade from fallback to content instead of snapping. Caveat for this audience: it is DOM only right now, React Native support is “working on it”.

Fragment Refs are the quieter win. Pass a ref to a <Fragment> and you get a FragmentInstance that operates on the fragment’s DOM children as a group: addEventListener, focus and focusLast, observeUsing for an IntersectionObserver or ResizeObserver, getClientRects, scrollIntoView. Every wrapper div you ever added purely to hang a ref off a list of siblings, and every time you had to patch a library component because it swallowed ref, that is what this deletes.

Also in the release: use(browser()) from react-dom, a first-class way to opt a component out of server rendering (it suspends on the server, not on the client, so no more mounted state or typeof window checks); Trusted Types support; and <Context> can now be rendered directly in Server Components.

React Native 0.88 hits release candidate

0.88.0-rc.0 shipped September 8. Stable is still 0.87.1. The breaking change is small: the undocumented Touchable root export is gone, use ViewProps if you were extending it as a type. The rest is mostly C++ hygiene that matters if you write native code, including new umbrella headers as public entry points (<React/FeatureFlags.h>, <React/RendererBridging.h>, <React/Timing.h>) and RCTArrayBuffer on iOS, an Objective-C representation of a JS ArrayBuffer for TurboModules with an explicit byte-ownership contract. Library authors: this is your week to build against the RC.

Expo SDK 58 goes to preview, EAS CLI ships a major

Expo published 58.0.0-preview.0 on September 10, after canaries all week, with 57.0.21 and 57.0.22 on the stable line. More consequential if you script CI: EAS CLI 24.0.0 (September 9) is a breaking release. The eas observe:* commands follow the renamed Observe schema, so --json output now uses name and value instead of metricName and metricValue, and exceptions moved out of observe:events into a new eas observe:errors. If a dashboard of yours parses that JSON, it broke on Tuesday. The follow-ups through 24.3.0 added eas channel:protect, eas workflow:insights and a Maestro flake-rate view, plus local egress for eas simulator:start so simulator traffic exits from your machine’s IP.

Gesture Handler 3.3.0, Worklets 0.12.2, Metro 0.87.1

Gesture Handler 3.3.0 (September 11) is a bug-fix release with a very familiar list: Android buttons firing press events when a scroll takes over the touch, native handlers attaching to a nested button instead of the detector’s child, dead presses in "never" mode with native keyboards. If your Android tap targets have been flaky inside scroll views, upgrade before you write another workaround. Worklets 0.12.2 (September 8) backports three crash fixes including a __proto__ handling crash. Metro 0.87.1 (September 13) adds resolver.schemeResolvers for URI-scheme-prefixed specifiers and replaces the image-size dependency with vendored parsers to clear CVE alerts, which is the kind of release nobody blogs about and everybody should take.

Around the wider stack

Vite 8.3.0 shipped stable on September 10 with build and proxy performance work. Next.js 16.3.5 (September 11) fixes the disk image cache on 0-byte entries and adds a CSP nonce to loading and template script tags. Node released 24.21.0 and 26.8.2, both picking up OpenSSL 3.5.8. And react-native-maps 1.29.1 and 1.29.2 landed on the same day, fixing a null overlay crash on Android and markers drifting off their coordinate when their content is transformed on iOS.

Worth reading

MLS key operations under a millisecond, by moving crypto to Rust

The most technically interesting thread on r/reactnative this week was someone getting MLS group encryption under 1ms in React Native by pushing the crypto into Rust behind a native module. This is the shape of every serious secure-messaging build: the protocol work does not belong in JavaScript, and the moment you accept that, your bridge design becomes the whole engineering problem. Worth reading alongside our chat library comparison if you are weighing build versus buy on encrypted chat.

Expo spent 24 hours using only apps built with Expo

Published September 10. It is marketing, and it is also the clearest answer to “can you actually ship a real app with this” that anyone has put in one place. Skim it, then send it to whoever on your team still says React Native is for prototypes.

Two of this week’s stories point the same way: agents changing what a team can afford to maintain, whether that is Shopify writing features twice or Expo deleting a DSL because the generated code is now the readable part. Worth thinking about before your next architecture meeting. If I missed something you shipped, say so in the comments and it goes in next Monday.

Leave a Reply 0

Your email address will not be published. Required fields are marked *