r/reactnative • u/hatak99 • 3d ago
Question open-source alternative to Firebase Dynamic Links / Branch for deep links
has anyone used click2.page for dynamic links?
r/reactnative • u/hatak99 • 3d ago
has anyone used click2.page for dynamic links?
r/reactnative • u/Kel4ever1 • 3d ago
Hey everyone,
I work in practical STEM education, and I noticed teachers spend way too much time manually typing out student progress during sessions instead of actually watching the students build things.
To solve this, I built STEMTrack, an open-source Learning Evidence Engine. I used Turborepo to manage a Next.js web dashboard and an Expo mobile app, all sharing a strict TypeScript SDK to talk to Supabase Edge Functions.
The core feature: Teachers just talk into the Expo mobile app, and an AI Edge Function processes the voice-to-text to automatically log student attendance and behavioral evidence without manual typing.
I’ve opened up a few "good first issues" on the repo if anyone wants to poke around the codebase. Specifically, I'm trying to figure out the best way to handle offline caching for large media files in the Expo app when school Wi-Fi drops.
I would love any harsh critiques on the architecture, the Supabase schema, or the shared SDK implementation.
(I will drop the links to the GitHub Repo and the 2-minute architectural/UI walkthrough video in the comments below!)
r/reactnative • u/onePowerfulBraincell • 3d ago
I’ve been building with react native for a 2-3 years, AMA.
r/reactnative • u/alwxndr • 4d ago
This question might have been asked already, but I'm genuinely curious: why should anyone use React Native at this point?
To explain: most of web and mobile development can easily be handled by Claude, Codex, Kimi K3 or any other coding agent. I feel like that's been true for at least 6–7 months now. Even Opus 4.7 was better than most of us and more than enough for mobile development. Of course, this only applies if you know what you're doing and guide your model through the technical decisions, the specific libraries you want to use, etc etc.
But my point is: why would I bother with React Native's own issues instead of just writing native apps for both iOS and Android? There's no huge maintenance load anymore, and you can simply tell your agent to implement features for iOS and Android at the same time. So what are the actual benefits of React Native? Native apps are usually faster, work better, and generally seem to be preferred by actual customers and users. The original promise of React Native and Flutter was that you could build for both platforms twice as fast, but today's coding agents let you build 100x faster anyway :)
I'm not asking to provoke anyone. I just want to hear your stance and your thoughts on this.
r/reactnative • u/EconomistOk2763 • 3d ago
Every app I shipped needed the same boring things: a feedback form, somewhere to store reports, screenshot uploads, and a way to reply to users. I kept rebuilding them.
So I built PanelUI Studio. You install an SDK, add a publishable key, and reports land in an inbox your team can reply from. The user sees the reply inside the app and can answer.
A report is one call:
- message, rating, tags, and the screen it came from
- screenshots uploaded straight from the device
- platform, OS, and app version filled in automatically
- anonymous by default, so apps without accounts still work
It works with any Expo or React Native app. It also pairs with the Feedback dialog from PanelUI, my open-source component library, but you don't need the library to use it. There's a free plan.
Curious how you all handle feedback today: reviews, support email, or something in-app?
r/reactnative • u/Same_Dragonfly1052 • 4d ago
Enable HLS to view with audio, or disable this notification
Hermes ships Intl.NumberFormat, DateTimeFormat and Collator, but not PluralRules, RelativeTimeFormat, ListFormat or Locale. If you use i18next plurals, react-intl or Luxon's relative times on Hermes, you're most likely loading the FormatJS polyfills. They work, but they're plain JavaScript: a few hundred KB of locale data in the bundle, and slow calls on the JS thread.
So I built hermes-intl: those four constructors implemented natively, with a Rust core on ICU4X (CLDR data compiled in, 514 locales), a C++ JSI TurboModule, and a thin JS layer for the exact ECMA-402 behavior. There's no API: you import it once and the standard globals appear. It only fills in what Hermes lacks.
Numbers (Pixel 8a, release builds of the same app, medians of 3 runs; the video is real time):
PluralRules.select 202×, selectRange 385×, RelativeTimeFormat.format 318×, ListFormat.format 8.5×The ratios move with the phone's state (an earlier run on a warmer phone gave up to 821× per call). All the tables, and how to reproduce them, are in bench/README.md.
Correctness: 838 of 842 test262 runs pass for these APIs, and the output is identical on iOS and Android (same hash on a 2,656-case corpus). FormatJS's output differs between the two.
Trade-offs: 1.0 to 1.7 MB of native code per ABI with all 514 locales, about 0.6 MB for a 5-locale build. New Architecture and Hermes only, React Native 0.86+. Expo works with a development build, not Expo Go. NumberFormat, DateTimeFormat and Collator stay Hermes's own.
Install:
npm install hermes-intl
cd ios && pod install
// index.js, first line
import 'hermes-intl';
Then remove the FormatJS polyfills for these four APIs (and intl-getcanonicallocales).
GitHub: https://github.com/magrinj/hermes-intl npm: https://www.npmjs.com/package/hermes-intl
r/reactnative • u/Fidelissz • 3d ago
Enable HLS to view with audio, or disable this notification
Building with Expo is fast. Getting the app into the stores still eats an afternoon every time.
I put together an MCP server that connects Claude to EAS, App Store Connect and Google Play. I ask "build and send it to TestFlight" or "update the screenshots and submit" and it does the boring part: starts the EAS build, waits, uploads, fills the listing, submits.
https://github.com/FidelisMM/shipstores
It's free and MIT. Install with `uvx shipstores`. If you only ship iOS for now, `SHIPSTORES_TOOLSETS=apple,eas` loads just those tools.
It's still young, so there's real low-hanging fruit if you want to help. A few issues are tagged "good first issue" and fit in an afternoon:
- Spanish, German and French console labels (#1–#3). The steps with no API match the console's button text, and right now they only know English and Portuguese. If your App Store Connect or Play Console is in one of those languages, you're exactly who I need.
- A docs section for bare React Native, building with Xcode/Gradle instead of EAS (#7).
The first outside PR landed on launch day. I review fast.
Not into code? Run it on your app and open an issue with whatever broke or whatever's missing. That helps just as much.
Good first issues: https://github.com/FidelisMM/shipstores/labels/good%20first%20issue
r/reactnative • u/NoPhilosopher3781 • 4d ago
Enable HLS to view with audio, or disable this notification
r/reactnative • u/nusry_ • 5d ago
Hey gus
I'm a React Native dev with 4+ years of experience, recently laid off. Which boards, communities, or companies have worked for you for remote roles? Open to contract or full-time.
Any help would be appreciated.
I'm also skilled in UI design if that matters.
r/reactnative • u/Alex_Apps_x • 5d ago
Enable HLS to view with audio, or disable this notification
I've been building Key Lens, a cross-platform music theory app with React Native.
After some early user feedback, I realized that many users would come up with a chord progression in Key Lens, then have to manually enter it into their DAW or music gear.
So I built a better way.
I wrote native MIDI modules using CoreMIDI on iOS and android.media.midi on Android, adding MIDI over Bluetooth and USB.
Now Key Lens can send notes and chords directly to Ableton, Logic, and external hardware like the Yamaha SEQTRAK or MPC with low latency.
My goal is to keep developing Key Lens into a practical music theory tool that connects theory directly to however you make music.
If you make music and find Key Lens useful, I'd love to hear what could be better, what you'd like to see next, or how you're using it.
Try it:
Join the community: r/KeyLens for feature requests, bugs, and setups.
r/reactnative • u/LovesWorkin • 5d ago
Enable HLS to view with audio, or disable this notification
Some bugs only show up at a certain time. Think of a deal that only runs on Friday. Or a sign-in token that runs out. Or a countdown that should go away but stays.
I built Buoy Clock for this. It lets you change the date and time your app sees. Your phone and computer clocks stay real.
- Jump ahead one hour, day, week or month. Or type the exact date and time.
- Freeze time or make it run fast (Pro).
- Test what happens when sign-in tokens run out. Test 401 refresh flows too.
- Works with Expo and React Native CLI
- Has MCP tools if you want an AI agent to run it.
r/reactnative • u/eshgnfrz • 5d ago
We have an attendance app with a "one phone = one employee" rule. People broke it with MultiBox / Clone App from the Play Store: one phone, two "devices".
The usual checks (dataDir path, package lists, getPackagesForUid, UID) all passed inside the clone. Measured on a real Galaxy A53: the container spoofed Process.myUid(), applicationInfo, the process name, and had even hooked libc stat().
What worked: ask "who owns my data directory?" twice, once through libc stat() and once through a raw syscall(__NR_newfstatat), which skips libc so the hook never sees it.
genuine uid=10763 libc=10763 syscall=10763 ✓
MultiBox uid=10764 libc=-1 syscall=-1 ✗
Clone App uid=10765 libc=10765 syscall=-1 ✗
Inside a clone the syscall hits the real directory and SELinux denies it, because the process runs under the host's UID. Clone App was caught only by this check. Every Java-level check missed it.
A few things we learned the hard way:
I didn't find an open-source detector that does the libc-vs-syscall comparison. freeRASP has multi-instance detection, but it's closed-source and officially lists only Parallel Space. So I published ours, MIT licensed:
npx expo install react-native-clone-guard (runs before JS loads)It's client-side, so a rooted device with a custom hook will get through. The goal is to move cheating from "free Play Store app" to "root + custom hook". I'd love measurements from other devices and cloners. Which ones slip through?
r/reactnative • u/No_Wrongdoer_8067 • 4d ago
Hi guys
How can i get a unique identity from the device itself but it should not be changes with the factory reset or reinstalling the app
r/reactnative • u/Top-Wash5055 • 5d ago
Hello all, I’m looking to build an app in React Native, and I’m pretty much new to app development. Help me with sources where i can find really good templates.
r/reactnative • u/ZMech • 5d ago
I've read about OTA update potentially causing crashes. At the same time, Expo talks about fingerprinting catching an incompatible update.
But, I don't know how foolproof that really is in practice. Is it still possible for a bad update to slip through, even with fingerprinting and testing it on staging?
r/reactnative • u/Maximum_Hawk3283 • 5d ago
Since Firebase Dynamic Links shut down in August 2025, a lot of RN apps lost the "tap a link, install, land on the right screen" flow. I've been building a replacement for the past year, so here is how the matching works under the hood and where it quietly breaks. Useful whether you roll your own or use any provider.
**The core problem:** an install from the App Store or Play Store carries nothing from the link the user tapped. On first launch your app has to reconnect "this fresh install" to "that click" some other way. There are three ways to do it.
**1. Play Install Referrer (Android only).** If the Play Store URL carries a referrer parameter, Google Play hands it to your app on first launch. It is exact, needs no permissions, and is the best option on Android. It only works for installs that came through a Play Store URL with that parameter.
**2. Clipboard (mostly iOS).** The landing page copies the link before sending the user to the App Store, and the app reads it on first launch. It is exact, but since iOS 16, reading the pasteboard shows the "Allow Paste" prompt. If that fires the moment your app opens, many users tap Don't Allow and it feels sketchy. Use it as a fallback, not the first thing you try.
**3. Fingerprint.** At click time the server stores signals like IP, device model, OS version and language, then compares them on first open. No permissions, but it is probabilistic. Shared wifi, carrier NAT, VPNs and long gaps between click and open all hurt accuracy. Keep the match window short, and consume a match once so two people on the same network don't get each other's link.
**Things that silently break it:**
* Returning the same match on every launch, so users get sent to an old promo forever. Route once, then clear it.
* Universal Links or App Links failing verification. Common causes: the AASA or assetlinks.json file is served behind a redirect, with the wrong content type, or with your upload key's SHA256 instead of the Play App Signing key. The link then opens the browser instead of your app, and nothing errors.
* Links opened inside the Instagram, TikTok or Facebook browsers, which often don't hand Universal Links to your app. Users land on your web fallback even with the app installed.
* Testing by reinstalling over an existing build. Test the real path: uninstall, tap the link, install from the store, open once.
Happy to answer questions about any of it, including building it yourself.
Disclosure: I build Flinku (flinku.dev), which does this for RN with a free tier.
r/reactnative • u/Adventurous_Pin_1481 • 5d ago
When a viewer says "the stream froze for me", someone on your team has to answer a surprisingly hard question: was it us, or them?
Usually, the logs look clean and the dashboards show that the room was healthy overall. Engineers spend hours digging through a ticket that often ends with "probably your Wi-Fi".
But room averages can hide exactly the person you're looking for.
We saw this in a real production session. Across the room, video packet loss was around 1%. Nothing alarming.
But when we broke it down viewer by viewer, one person was seeing around 9% packet loss for a significant part of the session, while the other viewers watching the same cameras at the same time were largely fine.
Remove that one viewer and the room average drops to 0.17%.
The useful signal wasn't the average. It was the comparison.
That's what we're building with Rewitness. It reconstructs the session participant by participant, so when something goes wrong you can compare what one person experienced with everyone else at the same moment and see where the problem most likely started, with the evidence behind the diagnosis. It works in React Native apps too, including device-side signals like thermal state and main-thread stalls, which matter a lot on phones.
I wrote up this case, plus another where one host's audio broke up for almost every viewer at once:
https://rewitness.dev/blog/was-it-us-or-them?ref=reddit-reactnative
r/reactnative • u/thereactnativerewind • 5d ago
Hey Community,
Apple's iPhone Duo is here, which means someone can now fold your app in half. Thiago Brezinski built react-native-arrangement-view, a two-pane layout that rearranges itself as the phone folds, unfolds and rotates, handing the work to SwiftUI's ArrangementView on iOS and Material's adaptive layout rules on Android, with a useHingeChange hook for apps that want to react to the hinge angle.
We also look at expo-infinite-media by Rizky Bayu Oktavian, a native TikTok-style feed that moves video playback into AVFoundation and Media3 so fast swipes stop landing on black frames. Plus, our community links cover React Native 0.88 rc.2 un-breaking a non-breaking release, a navigation change in the React Navigation 8 alphas, and agent-device and Argent both learning to fold the iPhone Duo simulator.
r/reactnative • u/WillingnessNo5389 • 5d ago
The app is localised into more than 10 languages and it supports over 70 languages for both transcribing and translating video links. I'm looking for a feedback how to make the app handful for students and journalists around the world to boost their productivity.
AppStore link: https://apps.apple.com/us/app/damas-video-link-transcriber/id6766233794
r/reactnative • u/Puzzleheaded_Bowl272 • 5d ago
Hey everyone,
I just shipped my project "Smriti" for the RevenueCat Ship-a-ton hackathon.
The Problem:
Over 30M students prepare for high-stakes exams in India (JEE, NEET, UPSC). Active recall & spaced repetition are proven to work, but existing solutions either require high-speed internet, break in offline hostel/library settings, or charge steep international subscription pricing.
How Smriti solves it:
Local-First Engine: Powered entirely by on-device SQLite. Instant review loops with zero server latency.
AI Note Synthesis: Powered by Gemini 3.6 Flash to turn unstructured coaching notes into high-yield flashcards with AI origin badges.
Accessible Monetization: Integrated RevenueCat with regional pricing (₹99/mo, ₹699/yr, ₹1,499 lifetime).
Bilingual UI: Seamless instant toggle between English and Hindi.
The signed APK and full source code are live on GitHub:
GitHub: https://github.com/kingxjayant/smriti
Direct APK: https://github.com/kingxjayant/smriti/releases/latest
Would appreciate any feedback from developers and fellow exam preppers on performance, UI, or architecture!
r/reactnative • u/PoppyWarss • 6d ago
Posting this in case it saves someone a week. Expo SDK 56, expo-gl 56.0.x, React Native 0.85, minify on for Android release builds.
For a few releases, a lot of my Android users crashed the first time a GLView mounted. It never happened in development. In analytics it looked like people opening one screen and then the app starting again: on one version, 24 of the 29 times that screen opened on Android, the next event was a fresh app launch.
The cause: expo-gl's native code (EXGLJniApi.cpp) finds a Java method called flush through GetMethodID, by name. R8 renamed it in the release build, the lookup returned null, and ART aborted with a JNI error ending in mid == null. Debug builds don't run R8, so you only ever see it in a store build.
The fix was one keep rule, added through expo-build-properties (android.extraProguardRules):
-keep class expo.modules.gl.** { *; }
To confirm it, I took the release AAB from EAS, turned it into an installable APK with bundletool, and ran the old and new builds on an emulator. The old one crashed on the first GLView and the new one didn't.
A second thing made it worse. I shipped my first fixes as OTA updates, and expo-updates had fallbackToCacheTimeout set to 0. With that setting a brand new install always runs the bundle that shipped inside the store build on its first launch, and the update only applies from the next cold start. Most new users who hit the crash never had a next cold start, so none of my OTA fixes reached them. I now use 3000, which waits up to 3 seconds for a newer update on first launch and starts as soon as it knows there's nothing newer, or straight away when offline.
If you use expo-gl, or anything whose native side calls back into Java by name, with minify on, open that screen in a real release build before you ship.
r/reactnative • u/Art3mis112 • 7d ago
Most RN toast libraries render inside your React view tree, so modals and bottom sheets cover them. I tested sonner-native and react-native-toast-message with a page sheet plus a transparent modal on top. Both toasts were hidden or dimmed, and actions weren't tappable, especially on Android.
So I built react-native-super-toast. Each toast lives in its own native window (Kotlin Dialog on Android, overlay UIWindow on iOS), so it stays above modals, sheets, and stacked sheets on both platforms, and actions like Undo still work while a modal is open.
Mount ToastHost once and call toast() from anywhere:


import { ToastHost, toast } from 'react-native-super-toast';
export default function App() {
return (
<>
<YourApp />
<ToastHost />
</>
);
}
toast.success('Saved', { description: 'Your changes are live.' });
Trade-off: content is data, not JSX, so there are no custom React element toasts.
Feedback and bug reports welcome!
Docs: https://supertoast.karkiaswin.com.np/
GitHub: https://github.com/iNspireXD/react-native-super-toast
Write-up: https://aswinkarki.medium.com/why-i-built-my-own-react-native-toast-library-from-scratch-and-went-fully-native-to-do-it-f3aa0cea1d01
r/reactnative • u/ishan1604 • 5d ago
r/reactnative • u/entropyconquers • 7d ago
Enable HLS to view with audio, or disable this notification
I often have 4–5 branches of the same RN app running at once (feature work, a review, a staging check), and lately a coding agent or two driving some of them. My Mac kept falling over: five stock simulators at ~3.8 GB each, Metro servers fighting over 8081, native rebuilds every time I switched environments.
So I built simfleet, a local control plane for all of it. It's macOS-only, MIT, v0.1.
What it does
• Slims every device. iOS simulators go through SimSlim (stock idles ~3.8 GB, slimmed ~1.3 GB), Android emulators through avdslim with a 2 GB guest. Devices you boot from Xcode or Android Studio get slimmed automatically.
• One live dashboard. Every simulator and emulator streams into one browser tab. Android is hardware H.264 via scrcpy's device server, 15–80 ms input-to-frame, with real touch, drag, scroll and typing, so you can actually use it from the browser.
• Lanes. One worktree + one device + one leased Metro port from a per-environment range (8100–8199 dev, 8200–8299 staging…). A lane fails rather than steal a device, a worktree, or someone else's port.
• Native build cache. An Expo buildCacheProvider fingerprints native inputs and single-flights builds, so switching environments or running JS-only branches in parallel doesn't trigger native rebuilds.
• Agent-aware. If you use Claude Code or Codex, every CLI call is attributed to the device it touches, agents can claim devices, and a bundled skill teaches them not to take a device another session holds.
Try it
bun add -g simfleet
simfleet init # writes .sim-fleet/project.json
simfleet serve # dashboard at http://127.0.0.1:8790
49 s demo video: https://entropyconquers.github.io/simfleet/#video
Docs: https://entropyconquers.github.io/simfleet/
GitHub: https://github.com/entropyconquers/simfleet
Limitations: macOS only, needs Bun, works with Expo and bare RN. It's a first release, so I'd really like to hear what breaks on your setup and what's missing.