Help needed for understanding expo-dev-client

Please provide the following:

  1. SDK Version: 41
  2. Platforms(Android/iOS/web/all): Android/iOS
  3. Add the appropriate “Tag” based on what Expo library you have a question on.

Hi, my team is using managed working with Expo and we’ve been trying to integrate Razorpay’s payment gateway( and it doesn’t work with Expo. We want to avoid ejecting from expo to bare react-native and I came across Custom Development Client(Getting Started - Expo Documentation). As this feature was recently released, it doesn’t have enough documentation to work with. Can anyone please help me understand what this feature is and whether or not we can use this to integrate our payment gateway.
Thank You

Hi! We do have documentation on it and a video intro, could you explain what isn’t clear after reading through the docs? That way we know what we can improve :slight_smile:


Here’s my understanding of EAS Build, expo-dev-client, etc.

EAS Build is the new way to build apps using Expo’s build servers. (As opposed to expo build:*)

If you build with expo build you get a predefined set of native code included in the app. This means that you cannot add new dependencies that include native code (like Razor Pay). Also, if there’s native code you don’t need (e.g. the face detector), you cannot remove this to make the app smaller.

With EAS Build you are able to add things like Razor Pay that depend on native code and when your app is built it will contain only the dependencies listed in your package.json. So if you don’t have something listed in your dependencies then the native code will not be included in your app. This makes apps built with EAS Build smaller and also removes potentially problematic SDKs like Facebook Ads etc.

However, if you install Razor Pay, then the native code that it needs is not included in Expo Go, so your app will crash if you try to run it on Expo Go. So the Expo team made expo-dev-client as basically a customized Expo Go app that includes only the dependencies from your package.json, which also includes extra native code (like Razor Pay).

There are some things that might be a bit tricky, though. e.g. OTA updates are more complicated because the native code is no longer fixed for every app using the same Expo SDK version, so you need to be careful when deploying OTA updates. See the Updates docs for details.

Also, some native dependencies need you to do stuff like edit or build.gradle etc. In order to do this without ejecting you need a Config Plugin. Since this is all pretty new, random React Native libraries do not have Config Plugins etc. The Expo team has written some (see their expo/config-plugins repository), but ideally the library authors would include config plugins in the library itself. Some already do (e.g. react-native-nfc-manager, react-native-vision-camera).

I hope that helps your understanding :slight_smile:


Hey! I found the documentation a little ambiguous as all of this is pretty new. I would’ve preferred an example snippet in the docs.

Thanks for your reply, so if I want to edit any of the code inside the \android and \ios folder, I’ll have to wait for the library’s author to include config plugins?

You can write the config plugins yourself.

Alternatively you could basically eject initially, but still use a dev client. Then when the config plugins you’re waiting for become available you can revert to the managed workflow. “Unejecting” is as far as I know a manual process, but not very difficult.

1 Like

Thanks! I’ll try this.

1 Like

There are examples in the expo/expo repository. Check for app.plugin.js in the packages

See also the ones in the expo/config-plugins repository.

I haven’t written any myself yet, so I am still unclear on some of the details.


See also:

This topic was automatically closed 20 days after the last reply. New replies are no longer allowed.