Category: Dev Gotchas

  • Essential Expo and EAS Commands Every React Native App Developer Should Know

    As a React Native app developer, one of the most powerful toolchains I rely on is Expo Application Services (EAS). EAS streamlines the way we build, test, and deliver apps, taking care of the complex native build steps that often trip up even experienced teams. For developers, it means faster iteration and fewer headaches when dealing with app stores. For clients, it translates into quicker releases, fewer delays, and confidence that your app can scale smoothly from the first prototype to production-ready builds.

    Drag

    But like any powerful tool, EAS comes with its own quirks. Knowing the right commands — and the gotchas that come with them — makes the difference between a smooth development cycle and wasted hours troubleshooting. In this article, I’ll walk through the most common Expo and EAS commands I use as a React Native app developer, highlighting not just what they do, but why they matter to the success of your project.

    Drag

    These are some commands I use very often for developing React Native apps with Expo. Keep in mind some additional packages such as expo-dev-client and expo-updates may be required. You may also need to update your eas.json channels.

    Drag

    Previewing your App Locally

    Drag

    expo start -c

    Bash

    Drag

    The -c flag just clears the cache, which I find helpful. In the latest version of Expo it will prompt you to run the development build or inside Expo Go. You can also just add the –dev-client flag to your command if you’d like to run your app in your development build.

    Drag

    Creating a Dev Build

    Drag

    eas build --profile development

    Bash

    Drag

    Creating a Dev Build for iOS Simulators

    Drag

    eas build --profile development-simulator --platform ios

    Bash

    Drag

    This will require a separate “development-simulator” profile with some additional configuration inside your eas.json file.

    Drag

    ESA Updates

    Drag

    eas update

    Bash

    Drag

    Updates are self-explanatory but can be used, also to distribute your app internally whiteout having to run a local server. You will need expo-updates installed for this one.

    Drag

    Submit your App to the GooglePlay and App Stores

    Drag

    eas submit

    Plain text

    Drag

    This will bundle your build and send it to the appropriate store for people to download and enjoy!

    Drag

    Mastering Expo and EAS isn’t just about knowing the commands — it’s about understanding how to avoid pitfalls and keep projects moving forward without costly delays. If you’re looking for a React Native app developer who can deliver high-quality apps while steering clear of common roadblocks, let’s talk. I’d love to hear about your project and help you bring it to life with the right tools and expertise.

  • Hidden Dependencies for Clerk Every React Native App Developer Should Know

    When integrating Clerk for Expo, you may run into some unexpected hiccups. The official documentation is helpful, but it leaves out a few critical dependencies that can make or break your build. As a react native app developer, I quickly learned that what works in Expo Go doesn’t always translate to a standalone app.

    Drag

    Here’s the catch: Expo Go has some dependencies pre-installed, so you won’t see any red flags during testing. But when you build your project, your app can crash if you don’t install a few packages manually, specifically expo-auth-session, expo-web-browser, and react-dom. Without them, your app simply won’t run as expected.

    Drag

    To keep your app stable, install these packages directly:

    Drag

    expo install expo-auth-session expo-web-browser react-dom

    Bash

    Drag

    This step ensures your Clerk provider has the underlying support it needs. It may feel redundant since Expo Go masks the issue, but for real-world builds (especially with EAS), skipping this will lead to frustration.

    Drag

    A Handy Shortcut With ClerkProvider

    Drag

    Another undocumented gem: the ClerkProvider component accepts your API key directly as a prop. As a mobile app developer, this saves me time and reduces complexity, since you don’t have to juggle environment variables in eas.config.js or app.config.js if you’d rather keep things simple.

    Drag

    Don’t Skip expo-doctor!

    Drag

    Before you build, do yourself a favor and run:

    Drag

    npx expo-doctor

    Bash

    Drag

    This command is like a personal check-up for your project. It won’t just catch the missing Clerk dependencies; it will also flag other hidden issues that can derail your build. Think of it as preventative care for your codebase. As a freelance app developer, I know expo-doctor can save us hours of chasing errors that expo-doctor could have solved in minutes.

    Drag

    Lessons Learned

    Drag

    After some hair-pulling, I discovered that the missing dependencies were the root cause of my Expo crashes. Once I installed them and re-ran expo-doctor, everything clicked into place. This experience was a reminder of why cross-platform app development requires both technical know-how and persistence. Documentation doesn’t always cover every scenario, but that’s where experience comes in.

    Drag

    If you’re a startup or business looking for custom app development with fewer roadblocks, I can help. With years of experience navigating React Native development services, I make sure your builds are smooth, your features reliable, and your launch stress-free.

  • Seamless Expo Updates: How to Automatically Upgrade Users to the Latest App Version

    For developers building with Expo, one of the sneakiest “gotchas” is how quickly outdated app versions can pile up in the wild. Users may continue running older builds long after new releases are available, leading to bug reports, missing features, and a fractured experience. This not only creates headaches for developers but also hurts customer confidence in the app.

    Drag

    Fortunately, Expo provides a way to bypass the App Store and Google Play update bottleneck by enabling automatic upgrades. With the right configuration, developers can ensure that users always run the latest version, instantly benefiting from new features and fixes. For businesses, this means fewer support issues, faster adoption of improvements, and a consistently polished product in the hands of every customer.

    Drag

    The eas-cli tool offers a really great way to make live updates to your app. Say you squash a bug and want to publish the changes to people who have your app installed. You would just run a simple Expo update. Next time they open your app, they’ll see the changes reflected. But sometimes, with new packages, infrastructure changes, or just larger updates, you’ll want to publish a new version through the Apple App Store and/or Google Play. It’s important to keep your users on the most up-to-date version of your app. Luckily, Expo offers a way to automatically compare the app version with the latest one in the app stores called Expo Updates.

    Drag

    First, install the Expo Updates package:

    Drag

    expo install expo-updates

    Bash

    Drag

    Then, import the package:

    Drag

    import * as Updates from "expo-updates"

    JavaScript

    Drag

    Now you can check for updates and give the option to install them like this:

    Drag

    const fetchUpdate = async () => {
       const update = await Updates.checkForUpdateAsync();
    
       if (update.isAvailable) {
          Alert.alert(
             "Time for an Upgrade!",
             "To use the latest and greatest features, update your app.",
             [
                {
                   text: "Update",
                   onPress: async () => {
                       await Updates.fetchUpdateAsync();
                       await Updates.reloadAsync();
                   },
                   isPreferred: true,
                },
                {
                   text: "Later",
                },
             ],
          );
       }
    };
    
    useEffect(() => {
       fetchUpdate();
    }, []); 

    JavaScript

    Drag

    Automating app updates with Expo solves a problem that frustrates both developers and end users. By embracing this approach, teams save time, reduce friction, and deliver a stronger experience across every install. For businesses, it’s more than a technical fix. It’s a competitive advantage that builds trust, improves retention, and keeps apps ready for what comes next.

  • Setting Up Your EC2 Instance for Next.js Hosting

    For any React Native app developer expanding into full-stack and web solutions, deploying a Next.js app on AWS EC2 is a power move. This setup combines the flexibility of cloud infrastructure with the performance of server-side rendering, ideal for businesses needing scalable, cross-platform app development. Whether you’re managing custom business app solutions or an enterprise-grade product, learning to host Next.js on EC2 builds confidence in creating seamless digital ecosystems that connect your mobile app development with robust, production-ready web experiences.

    Drag

    Be sure to use the desired region.

    Drag

    Create an SSH key pair and upload it to AWS before generating an EC2 instance. Use this key when setting up your EC2.

    Drag

    Install and Configure Apache

    Drag

    sudo apt update

    Bash

    Drag

    sudo apt install apache2

    Bash

    Drag

    sudo systemctl start apache2

    Bash

    Drag

    sudo systemctl enable apache2

    Bash

    Drag

    sudo a2enmod proxy_http

    Bash

    Drag

    sudo systemctl restart apache2

    Bash

    Drag

    Modify files in /etc/apache2/sites-available accordingly and enable and restart, if necessary:

    Drag

    sudo cp /etc/apache2/sites-available/000-default.conf /etc/apache2/sites-available/<domain>.conf

    Bash

    Drag

    sudo rm -R /var/www/html

    Bash

    Drag

    Example File:

    Drag

    <VirtualHost *:80>
        ServerAdmin webmaster@localhost
        ServerName <domain>
        ServerAlias <subdomain>.<domain>
        DocumentRoot /var/www/<project>
    ...
        ProxyPass / http://localhost:3000/
        ProxyPassReverse / http://localhost:3000/
    </VirtualHost>

    Plain text

    Drag

    sudo a2dissite 000-default

    Bash

    Drag

    sudo a2ensite <domain>

    Bash

    Drag

    sudo systemctl reload apache2

    Bash

    Drag

    Generate an SSL Certificate

    Drag

    Make sure to add the elastic IP address to the DNS records so the app resolves before completing the next steps.

    Drag

    sudo apt-get install certbot python3-certbot-apache

    Bash

    Drag

    sudo certbot --apache

    Bash

    Drag

    Install Node and NPM

    Drag

    sudo apt install nodejs

    Bash

    Drag

    sudo apt install npm

    Bash

    Drag

    Install PM2

    Drag

    sudo npm install pm2 -g 

    Bash

    Drag

    Clone Project

    Drag

    ssh-keygen

    Bash

    Drag

    Add your public key to GitLab through the Console.

    Drag

    sudo chown -R $USER /var/www

    Plain text

    Drag

    git clone git@gitlab.com:<something>/<something>.git

    Plain text

    Drag

    git fetch

    Plain text

    Drag

    git checkout <branch>

    Plain text

    Drag

    git pull

    Plain text

    Drag

    Start App

    Drag

    Add your variables with:

    Drag

    sudo nano .env

    Plain text

    Drag

    Inside the project run

    Drag

    npm install

    Plain text

    Drag

    npm run build

    Bash

    Drag

    pm2 start npm --name <project> -- run start -- -p 3000

    Bash

    Drag

    Gotchas

    Drag

    Cloning your Project

    Drag

    Do not use sudo when cloning your project.

    Drag

    Make Changes

    Drag

    Pull, install, and:

    Drag

    pm2 restart <project>

    Bash

    Drag

    Deploying a Next.js app on AWS EC2 gives you a solid foundation for growth, from performance-driven websites to cross-platform apps that feel polished, fast, and dependable. For any React Native app developer, understanding how your web and mobile layers connect is what transforms good code into great user experiences. With custom app development and ongoing support in mind, this workflow keeps your projects secure, scalable, and ready to meet enterprise demands without losing the creative edge your users love.

    Drag

    If you’re ready to bring your Next.js, Expo, or React Native project to life, or need expert guidance deploying your app on AWS, let’s talk. As a React Native app developer and mobile software engineer, I help startups and organizations build, launch, and scale cross-platform apps that perform beautifully across iOS, Android, and the web. Reach out today!

  • Why Android Push Notifications Need Extra Love

    For a React Native app developer, Expo Notifications offer incredible simplicity, until you get to Android. While device tokens make sending push notifications easy, Android introduces its own checklist: permission requests, Firebase integration, and channel configuration. Ignoring these details can cause notifications to vanish into thin air, leaving your mobile app development feeling incomplete.

    Drag

    After the iOS and Android dev builds are all set, install Expo Notifications to ask the user for permissions and require the device’s token to later send push notifications to.

    Drag

    Use the following to install Expo Notifications. The example in the documentation uses some other packages, too, so it’s worth a read.

    Drag

    Generate new, non-emulator dev builds after installing the packages.

    Drag

    npx expo install expo-notifications

    Bash

    Drag

    import * as Notifications from "expo-notifications";

    JavaScript (React)

    Drag

    Next, run the EAS CLI to make a new build. It will prompt to set up iOS push notifications. You just log in with app store credentials. Easy!

    Drag

    Expo Notifications uses Firebase Cloud Messaging (FCM) to send push notifications to Android devices. This requires a Google service account and the corresponding credentials.

    Drag

    It’s possible to get the FCM V1 service account key from Firebase. Create a Firebase project and create an Android App from the project dashboard. Click “Add app” and select the Android Logo. Enter the package name, which is usually in the app.json file. Run through the rest of the prompts and be sure to download the google-services.json file, add it to the root of the project, and commit it to version control. It’s needed later. Now download the private key which will be uploaded to Expo. Just go the settings for the new Android app in Firebase. It should be a cog icon. Click “Service accounts” and the button that says, “Generate new private key.” This should download your key automatically as a JSON file.

    Drag

    Now you need to upload your private key JSON file to Expo. Login to your Expo dashboard and select your project. Click “Credentials”from the left then select your Android application identifier. You can upload the JSON file you download under the “FCM V1 service account key” section.

    Drag

    Lastly we’ll tell Expo where to fine that google-services.json file. Head over to your app.json file and add the following under the Android section. It should look something like this:

    Drag

    {
      "android": {
        "googleServicesFile": "./google-services.json"
      }
    }

    JSON

    Drag

    You may need to add FCM permissions to your Firebase service account from the IAM section in Google Cloud. I think Firebase does this for you, though.

    Drag

    For a React Native app developer, getting Expo Notifications running smoothly on Android might feel like a detour, but it’s really the path to reliability. These extra setup steps with Firebase, service accounts, and permissions aren’t just technical hurdles; they’re what transform good mobile app development into trusted, production-ready software.

    Drag

    Once configured, your cross-platform app development gains the consistency users expect from top-tier apps. Every ping, alert, and message lands where it should, creating an experience that feels thoughtful and complete. That’s the real payoff of strong React Native development services: fewer “why didn’t I get that notification?” moments, and more confident connections between your app and its audience.

    Drag

    I see every small Android adjustment as an opportunity to elevate your product. With the right setup, your custom app development becomes future-proof; ready for scaling, launching, and thriving across every platform.