Artsy was falling behind its web product because native releases took longer. The team wanted a simpler way to structure views, faster iteration, better networking with GraphQL, and shared work across web and mobile. React Native also offered a path toward an Android app.
Integrating React Native into an existing native codebase
Speaker
Eloy Durán, an iOS developer at Artsy and a React Native contributor, explains how Artsy integrated React Native into its existing Eigen iOS app at a Callstack event.
Artsy put its React Native code in a separate repository called Omission, packaged as a CocoaPods dependency for the Eigen app. Eigen starts the React Native bridge and presents exported view controllers through its existing router, Switchboard, without needing to know React Native is running. Separate repositories and CI made onboarding and tooling easier, but added release, testing, and coordination overhead.
Omission exposes a native callback so React Native screens can send URLs to Switchboard and move among React Native, native, and web views. For nested scroll views, Artsy patched the native implementation to detect enclosing scroll views and forward scroll events with adjusted coordinates. This let JavaScript components paginate without handling the nesting themselves.
Artsy reused the app's SDWebImage cache so native and React Native views could share images, and drew artwork into opaque contexts to reduce compositing work. Durán says the approach worked in production, but teams should expect native engineering when designs cannot adapt to framework limits. He also cautions that adopting React Native means taking responsibility for its bugs and dependencies.
Takeaways
- Keep React Native behind native view controllers when you want to add it without changing the host app's workflow.
- A separate repository can simplify onboarding and tooling, but plan for extra release, testing, and issue-triage work.
- Use native bridges to connect React Native screens with existing routers and platform capabilities.
- Expect to build native workarounds when product requirements exceed framework defaults.
- Adopt a large open source dependency only if the team can maintain it and fix issues it encounters.
Mentioned in this talk
Search inside this talk
What was claimed 12
- foundedEloy Durán founded
Pods“I started CocoaPods.”
YouTube Unverified1 source· Talk
- integrates withArtsy integrates with React Native
“we started adopting React Native views”
YouTube Unverified1 source· Talk
- metricArtsy: React Native adoption began in April 2016
“that’s been happening since April 2016”
YouTube Unverified1 source· Talk
- built
“Emission is the part where we started adopting React Native views”
YouTube Unverified1 source· Talk
- built
“Eigen is the native app we’ve been working on since 2012.”
YouTube Unverified1 source· Talk
- metricEigen: 20 seconds to relaunch on a fast machine
“it took 20 seconds on a fast machine to relaunch”
YouTube Unverified1 source· Talk
- integrates withReact Native integrates with Yoga
“Layout is done natively in the background by Yoga”
YouTube Unverified1 source· Talk
- uses
“which we use for networking now in Swift”
YouTube Unverified1 source· Talk
- usesArtsy uses TypeScript
“We actually use TypeScript”
YouTube Unverified1 source· Talk
- uses
“a CocoaPods dependency that Eigen uses”
YouTube Unverified1 source· Talk
- integrates with
“package it as a CocoaPods dependency that Eigen uses”
YouTube Unverified1 source· Talk
- integrates withOmissions integrates with Switchboard
“our routing engine, called Switchboard”
YouTube Unverified1 source· Talk





