I was sitting at my desk at 10 PM on a Thursday in late 2025, staring at a screen full of ESLint warnings and Firebase logs. One of my clients — an Abu Dhabi-based plant shop owner — wanted a React Native app live on the App Store by the end of the month. They’d promised to coincide the launch with National Tree Day. I was pretty confident the app would be straightforward, but I’d forgotten how messy iOS builds get when you’re juggling Expo and localization.
The project ended up shipping as Greeny Corner, now in the UAE App Store with 10,000+ downloads and glowing feedback in Arabic and English. Here’s how (and why) I chose React Native with Expo for this project, plus the ugly details you don’t read about in tutorials.
Why I Chose React Native (This Time)
This wasn’t my first cross-platform rodeo. I’ve worked with Flutter, NativeScript, and the usual suspects, but this client needed something fast and cheap. I’d been using Expo for side projects and loved the rapid prototyping. They wanted a simple app for tracking plant care routines and connecting with local gardening suppliers — nothing that screamed “needs Swift native performance.”
Expo’s pre-configured environment got the MVP up in 48 hours. I spun up the project with npx create-expo-app, pulled in expo-router and a Firebase backend for auth and push notifications, and called it a day. My client didn’t care how it was built, as long as the budget didn’t balloon.
The Localization Hiccup
Halfway through the backend setup, the client dropped a bomb: “We want the app to switch between Arabic and English, and menus should flip for right-to-left reading.”
I agreed instantly but regretted it after discovering that most React Native navigation libraries still treat RTL as a second-class citizen. The Expo router package didn’t play nicely with Arabic diacritics in dynamic URLs, so I had to write a custom middleware layer to sanitize and redirect paths.
For example, the plant dictionary route ended up needing this:
/en/plants/cactus => /ar/نباتات/صبار It sounds glamorous, but the actual fix involved hours of hacking around i18n-js and a hackathon-style patch using react-native-localize.
The App Store Launch Saga
I’d done ExpoKit and bare React Native builds before, but this was my first EAS (Expo Application Services) build. I figured it’d take half a day. Spoiler: it took longer.
I kept running into a cryptic error about the App Store’s API being rate-limited. My build logs kept showing:
[!] Error processing your request: {"error":"too many requests"} After Googling for 20 minutes and cursing Apple’s documentation, I found out that I was triggering their throttling because I’d reused a bundle identifier from an old abandoned project. Fixed by updating the ios.bundleIdentifier in app.json.
The app submission itself was a breeze once I learned that Apple’s review takes 48 hours in the UAE during Ramadan — the client kept chasing me, thinking there was a mistake, but my contact at a Dubai software agency confirmed that reviewers go slower during the holy month.
UAE Market Realities
Here’s something they don't tell you in dev tutorials: Gulf users hate apps that don’t support SMS-based login. My client pushed back when I shipped the Firebase OAuth setup, saying, “What if someone is visiting Dubai and doesn’t have WhatsApp?”
So I rolled out an SMS-first auth flow using Firebase Authentication alongside MagicLink, which added three days to the project. But when the app dropped, it made sense — the top review was from a Saudi user thanking us for “not forcing me to sign in with Google.”
Also, the plant data had to pass cultural checks. For example, we filtered out snake plants (associated with bad luck in Emirati folklore) from curated gift bundles. It’s not a technical detail, but that kind of thing separates an app that gets downloads from one that gets shared organically.
Let’s Talk Performance
I won’t lie: I was worried about performance on older iPhones — Abu Dhabi still has folks using iPhone 8s for some reason. On paper, Expo runs slightly slower than bare React Native, but in practice, users here don't notice 0.2 seconds of lag unless they're gaming. I ran Lighthouse audits and optimized image loading with expo-image, and the app consistently scored over 90 on V8 benchmarks.
Still, for the “My Garden” tab, I had to cache the plant watering schedule in AsyncStorage because the Firebase listener introduced a 1.5s delay on 3G. That delay’s negligible in Helsinki, but noticeable in rural Al Ain.
Closing Thoughts
Greeny Corner shipped with zero crashes in the first week, and I’m honestly surprised how well Apple’s TestFlight worked for remote QA with testers in Kuwait and Dubai. Would I use Expo again for an iOS launch here? Yes, but with caveats:
- •Don’t skip testing EAS builds on UAE servers (DNS resolution can be wonky).
- •If your client wants Arabic localization, test the build on a physical device. iOS simulations of RTL layouts can lie.
- •Be prepared to explain Firebase analytics to UAE-based stakeholders who don’t care about “funnels” but want to know how many users share plants on WhatsApp.
This app wasn’t the hardest thing I’ve built — I’ve done real-time bidding platforms with Laravel and AI image generation tools in Python — but it reminded me that the hardest part of development is not the code, it’s guessing the 12th-hour client demand that’ll kill your deadline.
You can download the app on the UAE App Store profile or check out the repo (privately archived). If you're building a React Native app here in the GCC and want to avoid the Apple/Arabic/SMS headaches, feel free to hit me up.