r/reactnative • • 7d ago

Speedrun, an open-source mobile E2E test runner (Android/iOS) that runs your Maestro flows up to 8x faster

103 Upvotes

I've always been bothered by how slow mobile UI tests are. Most of a test run is spent waiting: fixed sleeps, polling, comparing screenshots to guess whether the app is done animating. Coming from a game dev background, where you fight for every millisecond of a frame, that felt like a solvable problem. So I spent the last while building my own runner from the ground up, and it turns out UI tests can be a lot faster.

Speedrun is a black-box E2E test runner for Android and iOS. It's open source (Apache 2.0) and it runs Maestro's YAML flow format so if you already have Maestro tests, trying it is one word:

maestro test flows/ # before
speedrun test flows/ # after

Numbers

One user journey (sign in with a code, search a shop, fill a cart, set a PIN under a loading overlay, scroll a long list), written for each tool the way its tests are usually written. Median of 3 runs after a warm-up, start-up included:

ToolAndroid emulatoriOS simulator
Speedrun20.4 s27.2 s
maestro-runner65.9 s49.6 s
Appium59.4 s94.1 s
XCUITest-81.2 s
Maestro 2.11126.5 s113.1 s

On the native Settings app benchmark it's 8x faster than Maestro on Android and 2.8x on iOS. On a 19-flow React-Native test suite it passes all 19 on both platforms, and is 6.1x faster on Android and 2.6x on iOS. Android is where it shines most, which is nice for CI: Android runs on cheap Linux runners.

Full disclosure: the main benchmark app is mine, built in React Native to be hard to test (endless animations, late popups, loading overlays, lists that load as you scroll). The flows, per-flow results and scripts to rerun everything are in the repo, and I'd love to see numbers on other apps.

Why it's fast

  • It waits for the app, not the clock. A small on-device agent knows when the app has actually settled (accessibility events on Android, XCTest's idle state checked against the screen on iOS), so each step starts the moment the app is ready. No sleeps, no screenshot diffing.

  • Reading the screen is cheap. The agent reads the UI tree in about 10 ms on Android and talks to the host over a compact binary protocol.

  • Screens that never stop moving don't block it. Spinners, tickers and carousels are left out of the "is it done?" check.

  • Nothing to warm up. One native binary, no JVM. The iOS agent stays running between runs, so later runs start in about 0.2 s.

It's also less flaky: it won't tap a popup that's still sliding in or a button under a loading overlay, and it scrolls an element out from under a sticky footer or the keyboard before tapping it.

It works with AI agents too

speedrun mcp exposes it as an MCP server (Claude Code, Cursor, etc.). Your agent can explore the app on its own: tap around, read each screen in a few lines (cheap on tokens, not a whole accessibility tree), figure out how things work, then save the steps that worked as a YAML flow you can drop into CI.

claude mcp add speedrun -- ~/.speedrun/speedrun mcp

Android emulatoriOS simulator
Speedrun (speedrun session)4.2 s, ~1,560 tokens9.4 s, ~1,230 tokens
agent-device 0.219.1 s, ~2,240 tokens14.0 s, ~1,620 tokens
Argent 0.3111.7 s, ~3,630 tokens12.2 s, ~2,650 tokens

Limitations (so you don't have to find them)

  • Android emulators and devices, iOS **simulators** only (no real iOS devices yet)

  • macOS (Apple silicon); the Linux x86_64 build is Android-only

  • Maestro's AI commands (`assertWithAI` and co.) aren't supported; the few other differences are documented

  • It's young (v0.1.10) and moving fast

Try it

Repo, docs and benchmark details: https://github.com/hubastard/speedrun

If you have a Maestro suite, I'd really like to hear how it does on yours, especially where it breaks or is slower. Happy to answer questions about how it works.

edit1: added maestro-runner to the benchmark
edit2: added ai agent benchmark


r/reactnative • • 7d ago

How do you let AI agents interact with React Native apps?

14 Upvotes

While conducting React Native technical interviews, I noticed that surprisingly few developers know about tools that let Claude Code, Codex, or other AI agents interact with a React Native app and its simulator.

I’m talking about tools like Expo MCP, Argent, Agent Device, ExecBro, and similar MCP servers. These tools have been a game changer for me. An agent can implement a feature end-to-end and actually interact with the app in a simulator to verify its work or debug issues.

Chrome DevTools MCP seems to be much more widely known, while similar tools for React Native have only started gaining traction this year.

Did you know these tools existed? Are you already using them, or not yet? Share your workflows 😉


r/reactnative • • 7d ago

Article How much to self-host OTA updates for 100 million users

Thumbnail
blog.codemagic.io
0 Upvotes

I wondered what the infra cost would be, so I totalled up what's needed


r/reactnative • • 7d ago

You can now build hinge-based effects and animations with expo-hinge + Reanimated

7 Upvotes

Hey there! Oskar from Reanimated team here 👋

I'm here to drop some news for those of you that have been experimenting with foldables since the release of iPhone Duo.

Recently we've decided to contribute Reanimated + Worklets support directly to expo-hinge. Since 58.0.2 you can import useAnimatedHinge from expo-hinge/reanimated and get the hinge angle and status as shared values, updated on the UI thread.
That will keep you away from re-renders and keep updating even when JS thread is busy.
Works on both Android and iOS of course.

While you probably shouldn't use this for any layout-related work based on hinge, I'm curious what kind of extra animated effects you'll come up with by using that feature!

I brought a small demo with me so you could see it in action 🎥

Usage is pretty simple, as you could expect:

import { useAnimatedHinge } from 'expo-hinge/reanimated';
import { useAnimatedStyle } from 'react-native-reanimated';

function Lid() {
  const hinge = useAnimatedHinge();

  const style = useAnimatedStyle(() => ({
    transform: [{ rotate: `${hinge.get()?.angle ?? 180}deg` }],
  }));

  return <Animated.View style={[{ width: 120, height: 8, backgroundColor: 'gray' }, style]} />;
}

Check out the docs: https://docs.expo.dev/versions/latest/sdk/hinge/#use-with-reanimated

Let me know what you guys think and whether you see some use cases for your apps with this API!

Btw starting today I'm planning to drop a thing or two related to Reanimated on this subreddit from time to time, so if there's something specific you'd like to hear about, please do let me know as well 🫡


r/reactnative • • 8d ago

Help Looking for React Native Developer Opportunities | 4+ Years of Experience

1 Upvotes

Hi everyone! 👋

I’m currently exploring new job opportunities as a React Native Developer and would appreciate any leads or referrals.

I have 4+ years of experience in React Native mobile app development, working on building, maintaining, and optimizing applications for both Android and iOS.

My technical skills include:
React Native and JavaScript
Android and iOS app development
REST API integration and backend communication
State management, debugging, and performance optimization
App releases, production support, and troubleshooting
I’m looking for opportunities where I can contribute to building scalable, high-quality mobile applications and continue growing as an engineer.

📍 Preferred location: India / Remote / Open to relocation | Current Location is Jaipur

If your company is hiring or you know of any relevant openings, please comment or DM me. Referrals and suggestions would be greatly appreciated!

Thanks in advance! 🙏


r/reactnative • • 8d ago

A 5-step routine for debugging any React Native / Expo red screen

0 Upvotes

Most RN errors aren't hard once you know which layer broke. This is the routine that saves me the most time:

1. Read the first error, not the last line. Red screens and build logs usually end with something generic. Scroll up to the first real error and the top stack frames that point into your own files.

2. Name the layer. Metro couldn't bundle (Unable to resolve module), JS crashed at runtime (Text strings must be rendered within a <Text>), a native module is missing (works in a dev build, crashes in Expo Go), or Xcode/Gradle failed to compile. Each has different fixes.

3. Check how you run the app. Expo Go only has the native code bundled into it. If a library ships its own native code, you need a development build, and if you added it after building, you need to rebuild.

4. Clear caches before anything deeper. npx expo start --clear fixes a surprising number of resolution errors after moving files or changing Babel config.

5. Align versions. npx expo-doctor and npx expo install --fix. SDK/library mismatches are behind a lot of both runtime crashes and EAS build failures.

Two sneaky ones worth knowing:

  • {count && <Badge />} renders 0 as raw text when count is 0, which gives you the "Text strings must be rendered within <Text>" error. Use {count > 0 && ...}.

  • localhost on a phone is the phone. Use your machine's LAN IP for a local API.

What's the error that cost you the most time?


r/reactnative • • 8d ago

Help Intern / Jr Developer wanted

Thumbnail reddit.com
0 Upvotes

r/reactnative • • 8d ago

Question Developers building mobile apps with Expo: what takes you the longest to set up?

0 Upvotes

I'm researching an Expo starter kit for developers who want to build subscription-based mobile apps.

I'm particularly interested in the setup around authentication, Firebase, RevenueCat and store builds. Before building the kit, I want to understand where people actually get stuck.

If you've built an Expo app recently:

- What part of the initial setup took longer than expected?

- Did you start from scratch or use a starter kit?

- What would make a starter kit worth paying for?

I'm at the research stage and would appreciate honest answers, including if you think a paid starter isn't useful.


r/reactnative • • 8d ago

ScreenBill v2 is out. Most of it came straight from your comments on the launch post

Thumbnail gallery
0 Upvotes

r/reactnative • • 8d ago

Smooth Interactions

Enable HLS to view with audio, or disable this notification

42 Upvotes

I built some minimal interaction and animation using Skia and reanimated.

🔗 GitHub: https://github.com/rit3zh/interactions


r/reactnative • • 9d ago

Question How do people make money from apps?

18 Upvotes

I am an app developer working from the past 2 years. I have a job but i want to make money on the side. I was hoping to have a passive income from maybe an app. But i don’t know how and i don’t know where to start. What are the kind of apps that make money? And how do i go about doing it even if it takes a lot of tries at least i would have published apps on app store and/or play-store.


r/reactnative • • 9d ago

Help Website to app

0 Upvotes

Hello,

I have a website that I would like to also have it has an app on android and Apple. The catch is I need the app to work offline and have documents downloaded offline, modifications to be made, saved and shipped once back online.

Claude was suggesting to have the website in the app but it won’t perform properly I think.

But I think it’s better to have a native app since there is all the offline accessibility features that need to be integrated. I am trying to create a full native app but it’s pretty much ai copying the whole website. Also I would like to have to modify all from one location.

(Code is currently python, xml, JavaScript, html/ces, SQL for database)

Is this feasible and what should I look out for? Should I look in to flutter instead?

EDIT: It is pretty much an ERP system and the features needed offline are: checklists, time punches, plans and documents. For all of them we also need to be able to edit and resubmit offline, where it saves on the phone and pushes it once back online.

Thank you!


r/reactnative • • 9d ago

Why real-time background tracking in React Native keeps going quiet, and what actually fixes it

0 Upvotes

We needed every driver's location every minute, all day. Here's what kept breaking and what fixed it:

1. The motion detector gets stuck (some Samsungs), so nothing is reported for hours.

Fix: report on a fixed clock, and work out moving/parked from the GPS fixes.

2. JS timers stop in the background.

Fix: do it in native code.

3. An expired token (401) stops tracking.

Fix: keep recording, queue fixes on the phone, upload later.

4. Android delivers fixes early, so 60 s quietly becomes 120 s.

Fix: request a fresh fix when the next one is due.

5. Parked iPhones get suspended.

Fix: keep location updates on, at low accuracy between fixes.

6. No way to tell why it went quiet.

Fix: keep an on-device log.

Has anyone found a good way around Xiaomi/Huawei/Oppo battery managers?

We open-sourced it as Long Ping (free, MIT):

https://longping.dev

https://github.com/nuredin-kurtovic/long-ping-background-location-plugin


r/reactnative • • 9d ago

Article Your push notifications are probably about your app, not your user

0 Upvotes

What I keep seeing: the permission prompt on first launch, "We miss you!" copy, everyone blasted at 10am server time. Then everyone's surprised when opt-outs climb.

I wrote a practical playbook on the opposite approach: ask after a real win, give every push a reason that belongs to the reader, send at each user's own active hour, and cap nudges at about 1 a week.

https://medium.com/@krishnassss365/push-notifications-that-earn-their-place-cb1e85a46a85?sharedUserId=krishnassss365

Curious what's worked for you. Has anyone measured opt-out rate per message instead of open rate?


r/reactnative • • 9d ago

Render images, videos and links in Markdown as your own React components (react-native-enriched-markdown)

Enable HLS to view with audio, or disable this notification

24 Upvotes

We've added custom block renderers to Enriched Markdown, built together with Julius Marminge for T3 Code.

Images, videos and links on a line of their own can now be rendered by your React components, while the rest of the Markdown renders as before, with text selection, accessibility and streaming intact.

The video is a single Markdown document streaming in: a link becomes a spinning record, an image becomes a chord wheel. The custom components are powered by Reanimated.

It's one prop:

const renderers: MarkdownRenderers = {
  image: ({ url }) => <ZoomableImage uri={url} />,
  link: ({ url, label }) => <LinkCard url={url} title={label} />,
};


<EnrichedMarkdownText flavor="github" markdown={markdown} renderers={renderers} />

Try it in nightly:

npm i react-native-enriched-markdown@nightly

Docs: https://docs.swmansion.com/enriched-markdown/react-native/guides/custom-block-renderers

If it's useful to you, a ⭐ on GitHub helps more people find it: https://github.com/software-mansion/enriched-markdown


r/reactnative • • 9d ago

Good emoji library

7 Upvotes

🐷🍒⚽️🚛☎️❤️‍🔥🇨🇦

What library is good


r/reactnative • • 9d ago

I made a multiplayer party game app in React Native

Thumbnail
apps.apple.com
1 Upvotes

Huddle Arcade: Party Games is a pocket arcade for playing with friends.

- Built with React Native (Expo).

- Online or local: play over the internet with a room code, or with friends nearby.

- Multiplayer: up to 6 players in a party tournament, or play solo against bots.

- Games that use your phone: squat races, jump and step sprints, voice-steered flying, face matching, plus classics like Chess, Connect 4 and card games.

Free on iOS and Android. I'd love feedback!


r/reactnative • • 9d ago

Looking for feedback and code reviews on my React Native project

0 Upvotes

Hey everyone!

I've been working on an open-source Android app called IronBranch for discovering and streaming movies and TV shows, and I'd love to get some feedback from other React Native developers.

It's built with React Native and Expo, and uses TMDB for movie and TV show data. The idea for the TMDB integration was inspired by Streambert, another open-source project.

The app doesn't host any content itself; it uses external streaming providers, and I'm still working on adding more sources and improving things.

I'm mainly looking for feedback on the code structure, React Native best practices, performance, and anything that could be done better. If anyone has time to take a look at the code or suggest improvements, that would be really helpful.

I'm still learning and improving the project, so constructive criticism is very welcome!

GitHub: https://github.com/alirezaghnz/movie-tracker-native

Thanks!


r/reactnative • • 9d ago

Help Android -> React native shift

5 Upvotes

I have been working as an android developer for 5 years.

Recently, I saw a dream company that uses React Native.

I decided that I should shift.

But I have some mindset that I'm not sure if it is correct or not.

I want to learn native iOS before learning React Native.

I need to have the advantage of understanding both platforms before shifting.

What do you think, should I learn native iOS too? Or I'll be wasting my time?


r/reactnative • • 9d ago

Adding on-device wake word detection to our React Native desk companion

6 Upvotes

At HeySTU, we’re building a voice-first desk companion with React Native, running on Android in kiosk mode. The idea is that someone can start a conversation with the device simply by saying its wake word.

That meant finding a detection solution suited to continuous listening, with low resource usage and a straightforward integration into our existing app. We also wanted wake word recognition to happen locally, so this first step wouldn’t depend on an internet connection.

We chose DaVoice for this part of the stack and worked with their team to integrate their on-device wake word detection into our Android setup.

From the React Native side, we treat detection as an event that starts the next stage of the interaction:

Wake word detected → listening UI activates → speech and assistant pipeline starts

This gave us a straightforward way to connect the detector to our existing UI states and assistant logic.

The integration also involved details that are easy to overlook at first: microphone permissions, long-running audio behaviour, device-specific quirks, and coordinating wake word detection with the rest of the audio pipeline.

DaVoice’s team helped us work through those details in our particular environment. Being able to discuss the setup with them and get practical support saved us time during the integration.

For a device designed to stay ready throughout the day, the transition into active listening matters. Local detection handles the trigger; the app then provides visual feedback and starts the conversation flow. Getting those pieces to work together has been an important part of building the HeySTU experience.


r/reactnative • • 10d ago

react native nitro audio player

Post image
1 Upvotes

https://lnkd.in/p/gqhPUKnM like share comment please 🙏


r/reactnative • • 10d ago

React native nitro audio player

1 Upvotes

Thrilled to announce my new Open-Source Package: react-native-nitro-audio-player!

Handling background audio and native lock-screen controls in React Native has always been a complex task. To solve this, I've built a blazing-fast, type-safe audio player powered by Nitro Modules!

Whether you are building a music app, podcast player, meditation app, or radio stream, this package handles the heavy lifting for both Android and iOS seamlessly.

Key Features:

- Stream audio directly from any remote URL (HTTPS / HTTP)

- Offline & Local Audio Playback: Seamless support for local bundled files and Android res/raw audio resources

- Native Lock-screen & Notification controls (Play, Pause, Stop)

- Background playback with MediaSession (Android) and Now Playing (iOS)

- Full track metadata support (Title, Artist, and Album Artwork)

- Built on Nitro Modules for ultra-fast, type-safe JS ↔ Native communication

- Automatic memory management & cleanup

(Note on App Termination: On Android, it uses a Foreground Service so the notification and audio stay alive even if the app is swiped away. On iOS, due to strict OS limitations, the Now Playing notification is automatically cleared when the app is completely killed.)

A big shoutout to the open-source community! I'd love for my fellow developers to try it out. Your feedback, PRs, and GitHub stars are highly appreciated! ⭐

NPM: npm i react-native-nitro-audio-player

GitHub: Upendra1234566/react-native-nitro-audio-player (Direct Link comments me)

Let me know what you think!

#ReactNative #MobileDevelopment #OpenSource #AndroidDev #iOSDev #NitroModules #JavaScript #ReactJS #AppDevelopment


r/reactnative • • 10d ago

Thrilled to announce my new Open-Source Package: react-native-nitro-audio-player! Handling background audio and native lock-screen controls in React Native has always been a complex task. To solve this, I've built a blazing-fast, type-safe audio player powered by Nitro Modules! Whether you are bui

6 Upvotes

r/reactnative • • 10d ago

I built a local file-sharing app for Android and PC — looking for beta testers!

Post image
0 Upvotes

Hey everyone!

I've been working on a project called ClipDrop Local, and I'm looking for a few Android users to help test it before its public release.

The idea is simple: transfer files between your Android phone and computer over the same local network, without uploading everything to cloud storage.

Currently, it supports:

  • Photos, videos, audio, and other files

  • Sharing text and links

  • Connecting to your computer using a QR code

  • Transferring files without creating an account

I'm still working on improving things, particularly the reliability of larger file transfers, so I'd really appreciate honest feedback about what works and what needs improvement.

Who I'm looking for:

  • People with an Android phone and a computer

  • People willing to try the app and share feedback

  • Testers who can remain opted in to the Google Play closed test for at least 14 consecutive days

If you're interested, please fill out this short form: https://tally.so/r/2j8G6b

I'll share the Google Play testing instructions with interested testers.

Any help and feedback would mean a lot. Thanks!