<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Muhammad Hasbi</title>
    <description>The latest articles on DEV Community by Muhammad Hasbi (@onlyhasbi).</description>
    <link>https://dev.to/onlyhasbi</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F371965%2F256ff027-1baf-486f-b870-4ba1b36557ca.jpg</url>
      <title>DEV Community: Muhammad Hasbi</title>
      <link>https://dev.to/onlyhasbi</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/onlyhasbi"/>
    <language>en</language>
    <item>
      <title>Axero Bento: Reinventing the Intranet for the Future of Work</title>
      <dc:creator>Muhammad Hasbi</dc:creator>
      <pubDate>Sun, 27 Jul 2025 13:45:38 +0000</pubDate>
      <link>https://dev.to/onlyhasbi/axero-3l2m</link>
      <guid>https://dev.to/onlyhasbi/axero-3l2m</guid>
      <description>&lt;p&gt;&lt;em&gt;This is a submission for &lt;a href="https://dev.to/challenges/frontend/axero"&gt;Frontend Challenge: Office Edition sponsored by Axero, Holistic Webdev: Office Space&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Built
&lt;/h2&gt;

&lt;p&gt;This project utilizes a Bento layout to depart from the traditional designs commonly seen in other projects. The styling follows a modern, isomorphic approach and incorporates smooth initial transitions to ensure an engaging user experience. Furthermore, the widget layout is intentionally designed to follow natural eye-tracking patterns, creating an intuitive, minimalist, and easy-to-navigate flow for the user.&lt;/p&gt;

&lt;h2&gt;
  
  
  My Journey
&lt;/h2&gt;

&lt;p&gt;When I first came across the Axero Frontend Challenge, I was excited by the idea of reimagining how intranets could look and feel. Most dashboards I’ve seen are cluttered, overly technical, and hard to navigate—so I set out to build something different. I wanted to create a space that feels clean, intuitive, and modern—something a team would genuinely enjoy using day to day. This led me to experiment with Bento-style layouts, natural eye-tracking flows, and smooth transitions to craft a dashboard experience that’s not only functional, but delightful.&lt;/p&gt;

&lt;h2&gt;
  
  
  What I Learned
&lt;/h2&gt;

&lt;p&gt;Working on this project taught me the importance of layout psychology—how visual hierarchy and flow can impact usability in a big way. I also deepened my understanding of responsive design using CSS Grid/Flexbox and practiced structuring components to be both reusable and accessible. Lastly, I gained valuable experience implementing smooth page transitions and dynamic layouts that respond well to real user behavior, which I plan to apply in future UI/UX projects.&lt;/p&gt;

&lt;h2&gt;
  
  
  Demo
&lt;/h2&gt;

&lt;p&gt;&lt;a href="https://axero-do9i.onrender.com/" rel="noopener noreferrer"&gt;Axero&lt;/a&gt;&lt;/p&gt;

</description>
      <category>devchallenge</category>
      <category>frontendchallenge</category>
      <category>css</category>
      <category>javascript</category>
    </item>
    <item>
      <title>[New] React Native &amp; Android SDK 15: A Developer's Guide</title>
      <dc:creator>Muhammad Hasbi</dc:creator>
      <pubDate>Sat, 12 Jul 2025 06:26:52 +0000</pubDate>
      <link>https://dev.to/onlyhasbi/new-react-native-android-sdk-15-a-developers-guide-485m</link>
      <guid>https://dev.to/onlyhasbi/new-react-native-android-sdk-15-a-developers-guide-485m</guid>
      <description>&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvqv0va1lf18f7ek1x8e.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fcvqv0va1lf18f7ek1x8e.png" alt=" " width="800" height="446"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://support.google.com/googleplay/android-developer/answer/11926878?hl=en" rel="noopener noreferrer"&gt;Google Announcement&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Google recently announced new requirements for apps targeting Android 15." This immediately establishes the "why." In this guide, we'll walk you through exactly how to get your React Native app compliant.&lt;br&gt;
Let's jump into the steps.&lt;/p&gt;


&lt;h3&gt;
  
  
  Prerequisites
&lt;/h3&gt;

&lt;p&gt;Before you start, note that targeting Android 15 requires the following configuration and tools.&lt;/p&gt;
&lt;h4&gt;
  
  
  1. Update Android SDK Versions
&lt;/h4&gt;

&lt;p&gt;In your &lt;code&gt;android/build.gradle file&lt;/code&gt;, update the SDK versions:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;compileSdkVersion = 35
targetSdkVersion = 35
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You can find the official requirements on the &lt;a href="https://developer.android.com/about/versions/15/setup-sdk" rel="noopener noreferrer"&gt;Android 15 setup page&lt;/a&gt;. &lt;/p&gt;

&lt;h4&gt;
  
  
  2. Required Development Tools
&lt;/h4&gt;

&lt;p&gt;Ensure your development environment is up to date:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Java version 17&lt;/li&gt;
&lt;li&gt;Node.js version 23.7.0 (Avoid typescript issue)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Don't forget to also &lt;strong&gt;upgrade&lt;/strong&gt; your &lt;strong&gt;Android Emulator SDK to 35&lt;/strong&gt; to test your changes.&lt;/p&gt;

&lt;h3&gt;
  
  
  Upgrade Process
&lt;/h3&gt;

&lt;p&gt;To update your project to a React Native version that supports Android SDK 35, the official React Native Upgrade Helper is your best tool. It provides a detailed diff of the changes between versions.&lt;/p&gt;

&lt;p&gt;To update existing React Native Version that approved by Android SDK 15, please follow this&lt;/p&gt;

&lt;p&gt;&lt;a href="https://react-native-community.github.io/upgrade-helper/?from=0.72.1&amp;amp;to=0.78.0&amp;amp;package=com.appname&amp;amp;name=AppName" rel="noopener noreferrer"&gt;➡️ View the React Native 0.72.1 to 0.78.0 Upgrade Diff&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Follow the changes suggested by the upgrade helper. Below are some common manual fixes you might need to apply afterward.&lt;/p&gt;

&lt;h3&gt;
  
  
  Post-Upgrade Fixes
&lt;/h3&gt;

&lt;p&gt;After running the upgrade, you may encounter a few specific issues. Here’s how to solve them.&lt;/p&gt;

&lt;h4&gt;
  
  
  1. Main Component Name Correction
&lt;/h4&gt;

&lt;p&gt;The upgrade process might reset your main component name. Check the following &lt;code&gt;file: android/app/src/main/java/com/your-app-name/MainActivity.kt&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;You'll need to update this line to use your app's actual name. You can find the correct name in your &lt;code&gt;app.json&lt;/code&gt; file under the &lt;code&gt;name&lt;/code&gt; or &lt;code&gt;displayName&lt;/code&gt; key.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# android/app/src/main/java/com/your-app-name/MainActivity.kt

override fun getMainComponentName(): String = "RnDiffApp"
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  2. iOS Firebase Configuration (If Applicable)
&lt;/h5&gt;

&lt;p&gt;If you're using Firebase and building for iOS, you may need to update your &lt;code&gt;ios/Podfile&lt;/code&gt; to handle static frameworks. Inside your &lt;code&gt;target&lt;/code&gt; block, add the following lines (adjust them based on your specific Firebase integration):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;#ios/Podfile

target 'Development' do
  config = use_native_modules!

  flags = get_default_flags()

  use_frameworks! :linkage =&amp;gt; :static
  $RNFirebaseAsStaticFramework = true

  pod 'Firebase', :modular_headers =&amp;gt; true
  pod 'FirebaseCoreInternal', :modular_headers =&amp;gt; true
  pod 'GoogleUtilities', :modular_headers =&amp;gt; true
  pod 'FirebaseCore', :modular_headers =&amp;gt; true

//...other script
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h5&gt;
  
  
  3. Fixing Status Bar and Navigation UI (Edge-to-Edge)
&lt;/h5&gt;

&lt;p&gt;A common issue after this upgrade is a broken UI around the status bar and bottom navigation. This happens because Android 15 enforces an "edge-to-edge" display, where your app draws behind the system bars.&lt;/p&gt;

&lt;p&gt;To fix this, you need to implement proper safe area handling.&lt;/p&gt;

&lt;h6&gt;
  
  
  Step 1: Install Helper Packages
&lt;/h6&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;# use npm
npm install react-native-edge-to-edge react-native-safe-area-context

# use yarn
yarn add react-native-edge-to-edge react-native-safe-area-context
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h6&gt;
  
  
  Step 2: Update Android Theme
&lt;/h6&gt;

&lt;p&gt;In &lt;code&gt;android/app/src/main/res/values/styles.xml&lt;/code&gt;, change the &lt;code&gt;AppTheme&lt;/code&gt; parent to &lt;code&gt;Theme.EdgeToEdge&lt;/code&gt;.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;android/app/src/main/res/values/styles.xml

&amp;lt;resources&amp;gt;
    &amp;lt;style name="AppTheme" parent="Theme.EdgeToEdge"&amp;gt;
        &amp;lt;/style&amp;gt;
&amp;lt;/resources&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h6&gt;
  
  
  Step 3: Modify MainActivity
&lt;/h6&gt;

&lt;p&gt;Next, to enable edge-to-edge display in your main Android activity, modify the &lt;code&gt;onCreate&lt;/code&gt; function in &lt;code&gt;android/app/src/main/java/com/YourAppName/MainActivity.kt&lt;/code&gt; and add &lt;code&gt;WindowCompat.setDecorFitsSystemWindows&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Setting it to false essentially means: "Hey Android, do not automatically fit my app's layout around the system bars. Let my app draw underneath them instead."&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import androidx.core.view.WindowCompat

  override fun onCreate(savedInstanceState: Bundle?) {
    super.onCreate(null)
    WindowCompat.setDecorFitsSystemWindows(window, false)
  }
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h6&gt;
  
  
  Step 4: Wrap Your Screens
&lt;/h6&gt;

&lt;p&gt;Finally, wrap your screens with &lt;code&gt;SafeAreaView&lt;/code&gt; from &lt;code&gt;react-native-safe-area-context&lt;/code&gt; to prevent your UI from being hidden by system elements like the notch or home indicator.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { SafeAreaView } from 'react-native-safe-area-context';

function MyScreen() {
  return (
    &amp;lt;SafeAreaView edges={['bottom']} style={{ flex: 1 }}&amp;gt; // Add edges={['bottom']} to add spesific edges
      {/* ... your screen content ... */}
    &amp;lt;/SafeAreaView&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Or apply padding manually where needed using the &lt;code&gt;useSafeAreaInsets&lt;/code&gt; hook:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;import { useSafeAreaInsets } from 'react-native-safe-area-context';

function MyComponent() {
  const insets = useSafeAreaInsets();

  return (
    &amp;lt;View style={{ 
      flex: 1, 
      paddingTop: insets.top, 
      paddingBottom: insets.bottom 
    }}&amp;gt;
      {/* ... your component content ... */}
    &amp;lt;/View&amp;gt;
  );
}
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  Conclusion
&lt;/h2&gt;

&lt;p&gt;Your React Native application should now be configured to target Android 15 and handle modern UI requirements like edge-to-edge display. &lt;/p&gt;

&lt;p&gt;Key Benefits of Targeting SDK 35:&lt;br&gt;
Updating both versions is essential, but targeting SDK 35 is where you'll see the most impactful changes.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Enhanced Security and Privacy (A Major Focus) &lt;a href="https://www.youtube.com/shorts/_xx1Cso00fY" rel="noopener noreferrer"&gt;Theft Detection Lock&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;Modern User Interface and Experience (UX)&lt;/li&gt;
&lt;li&gt;Significant Performance and Battery Improvements&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Hopefully, this guide helps you save some time. If you have any questions or recommendations, please let me know in the comments. Thanks, and happy coding!&lt;/p&gt;

</description>
      <category>reactnative</category>
      <category>android</category>
      <category>programming</category>
    </item>
    <item>
      <title>How to Integrate React Native CLI and Detox into CircleCI</title>
      <dc:creator>Muhammad Hasbi</dc:creator>
      <pubDate>Thu, 28 Nov 2024 09:42:56 +0000</pubDate>
      <link>https://dev.to/onlyhasbi/integrate-react-native-cli-detox-to-circleci-phj</link>
      <guid>https://dev.to/onlyhasbi/integrate-react-native-cli-detox-to-circleci-phj</guid>
      <description>&lt;p&gt;&lt;strong&gt;My First Experience&lt;/strong&gt; Integrating React Native with CircleCI&lt;br&gt;
A couple of days ago (22/11/2024), I got a task to integrate our React Native development app with CircleCI. My principal engineer provided the initial configuration, and I thought, "This shouldn’t be too hard—I just need to plug in the config and make it work."&lt;/p&gt;

&lt;p&gt;But when I tried running it, the tests failed.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mwr73llz2jhyx7jwwnd.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9mwr73llz2jhyx7jwwnd.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Here’s the configuration I started with:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: 2.1

orbs:
  node: circleci/node@5.2.0
  android: circleci/android@2.5.0
  rn: react-native-community/react-native@7.3.0
  ruby: circleci/ruby@2.1.1

commands:
  detox_build_android:
    steps:
      - android/restore-gradle-cache
      - run: |
          npm install -g detox-cli react-native-cli
          yarn android:detox:build:emu
      - android/save-gradle-cache
  create_env_file:
    steps:
      - run:
          name: Creating .env file
          command: |
            cat \&amp;lt;&amp;lt; EOF &amp;gt; .env
            APP_ID=$APP_ID
            &amp;lt;another_env_property&amp;gt;
            EOF
      - persist_to_workspace:
          root: .
          paths:
            - .env

jobs:
  detox_android:
    executor:
      name: android/android-machine
      resource-class: large
      tag: "2023.08.1"
    steps:
      - checkout
      - create_env_file
      - run:
          name: Cat .env File
          command: cat .env
      - run:
          name: Install dependencies
          command: yarn install --frozen-lockfile
      - run:
          name: Generate release.keystore
          command: echo "$RELEASE_KEYSTORE" | base64 --decode &amp;gt; android/app/release.keystore
      # - detox_build_android
      - rn/android_emulator_start:
          device_name: Pixel_5_API_33
      # - run:
      #     name: Set APK Path
      #     command: echo "APK_PATH=android/app/build/outputs/apk/release/app-release.apk" &amp;gt;&amp;gt; $BASH_ENV
      - run:
          name: Wait for Emulator to Fully Boot
          command: |
            adb wait-for-device
            adb shell getprop sys.boot_completed | grep 1 || sleep 5
            adb shell input keyevent 82
      - detox_build_android
      - run:
          name: Run Detox Tests
          command: detox test -c android.emu.release --loglevel verbose

workflows:
  test_and_distribute:
    jobs:
      - detox_android:
          filters:
            branches:
              only:
                - main
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;A New Challenge&lt;/strong&gt;&lt;br&gt;
To be honest, I had never worked with anything related to CI/CD before, so this was my first experience—exciting, but also a little daunting! 😅&lt;/p&gt;

&lt;p&gt;I dove into trial and error mode, trying everything I could think of. After what felt like 374 attempts, I decided to explore the documentation more thoroughly.&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9a84pigqz5oxfniel5nk.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F9a84pigqz5oxfniel5nk.png" alt=" " width="800" height="43"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;That’s when I stumbled upon a helpful blog post: &lt;a href="https://dev.to/kyonru/react-native-e2e-tests-and-automatic-deploys-detox-fastlane-circleci-3gkn"&gt;React Native E2E Tests and Automatic Deploys (Detox + Fastlane + CircleCI)&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This blog provided a lot of insight into the flow I needed to follow to get the tests running.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Debugging the Configuration&lt;/strong&gt;&lt;br&gt;
One key thing to note about CircleCI’s free plan is its limitations. For example, apps can only be run on Linux. If you need to test with iOS, you’ll have to upgrade to a paid plan.&lt;/p&gt;

&lt;p&gt;After carefully reviewing the configuration provided, I realized one critical step was missing: &lt;a href="https://circleci.com/developer/orbs/orb/react-native-community/react-native#commands-metro_start" rel="noopener noreferrer"&gt;starting the Metro bundler&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I checked the CircleCI React Native documentation and found a specific command to run Metro. After adding this step to the config, everything finally worked smoothly! yay !&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6u33j1egevxv2jmy3l87.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2F6u33j1egevxv2jmy3l87.png" alt=" " width="800" height="181"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Firljiogy9fw2ew5tpbns.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Firljiogy9fw2ew5tpbns.png" alt=" " width="800" height="257"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqg7p7y8jlmo4ofrd91z8.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fqg7p7y8jlmo4ofrd91z8.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7vxr8eu5lsykt6q0hca.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fi7vxr8eu5lsykt6q0hca.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;a href="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiz8df24z6nsf4l796vtc.png" class="article-body-image-wrapper"&gt;&lt;img src="https://media2.dev.to/dynamic/image/width=800%2Cheight=%2Cfit=scale-down%2Cgravity=auto%2Cformat=auto/https%3A%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Farticles%2Fiz8df24z6nsf4l796vtc.png" alt=" " width="800" height="424"&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;My Working Configuration&lt;/strong&gt;&lt;br&gt;
Here’s the configuration I used to run React Native CLI with Detox on CircleCI. Keep in mind that since I’m using the free plan, this setup only works for Android. To run tests on iOS, you’ll need to subscribe to a paid plan.&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;version: 2.1

orbs:
  rn: react-native-community/react-native@8.0.0
  android: circleci/android@3.0.2

commands:
  install_init:
    steps:
      - rn/yarn_install
      - run:
          name: Install Global CLI Tools
          command: |
            npm install -g detox-cli react-native-cli
            react-native --version

jobs:
  checking:
    executor:
      name: rn/linux_js
      node_version: '18.2'

    steps:
      - checkout
      - install_init
      - run:
          command: yarn checker // run linter, prettier, jest
      - persist_to_workspace:
          paths:
            - .
          root: .

  test_android:
    executor:
      name: android/android_machine
      resource_class: large
      tag: '2023.10.1'

    steps:
      - attach_workspace:
          at: .
      - rn/android_emulator_start:
          build_tools_version: '33.0.0'
          device_name: Pixel_5_API_33
          platform_version: android-33
      - install_init
      - rn/metro_start
      - run:
          name: Detox Test
          command: yarn detox:test:android -l verbose

workflows:
  e2e_test:
    jobs:
      - checking
      - rn/android_build:
          name: build_android
          build_image_version: 'v15.0'
          resource_class: large
          build_cache: false
          gradle_options: '-Xmx4g -XX:MaxMetaspaceSize=512m'
          build_type: debug
          requires:
            - checking
      - test_android:
          requires:
            - build_android
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;&lt;strong&gt;Lessons Learned&lt;/strong&gt;&lt;br&gt;
This experience taught me the importance of reading the documentation thoroughly and not being afraid to experiment. CI/CD might seem intimidating at first, but once you understand the flow, it becomes manageable—even fun!&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
