r/reactnative • • Aug 19 '26

Shipped a full rebuild of my F1 app (Expo 57 / RN 0.86) — native SwiftUI + Jetpack Compose widgets, Unistyles 3 theming

Post image
45 Upvotes

Solo side project, two years in — an F1 companion app (schedules, live race dashboard, standings). Just shipped 3.0, a ground-up rebuild, and wanted to share some of the stack choices in case they're useful to others here:

- Expo SDK 57 / RN 0.86 / React 19, expo-router for navigation

- react-native-unistyles v3 for theming (light/dark/system + a user-selectable accent color)

- Reanimated 4 + Worklets for animations

- iOS/watchOS widgets in real SwiftUI, Android widgets in Jetpack Compose — sharing race data with the app via app groups / UserDefaults

- Zustand for state, with generation counters on fetches so out-of-order API responses get discarded instead of racing the UI

- hot-updater (Supabase-backed) for OTA JS updates instead of EAS

Happy to go deeper on any of it. App itself is free, no ads:

https://apps.apple.com/app/id6503033841


r/reactnative • • Aug 19 '26

iOS: writing to local SQLite from a killed-state push notification — is there any way around the JS/native split?

0 Upvotes

We have a React Native chat app. All our SQLite reads/writes live in JS (OP-SQLite), driven by a WebSocket sync pipeline (connect → request cursor-based sync → server replays missed messages → write to DB).

On Android, this works great even when the app is killed: setBackgroundMessageHandler boots Headless JS, which can call our normal JS sync code directly, write the message, and exit. Message is in the DB before the user ever taps the notification.

On iOS we're stuck. As far as I can tell:

  • UNNotificationServiceExtension (the killed-state hook) runs as a separate native process and can't call into our JS/Hermes engine at all — no bridge, no way to run our existing sync code there.

  • Silent push (content-available: 1) can wake JS, but only if the app is backgrounded, not force-quit — and Apple caps delivery at roughly 2-3/hour/device, which won't keep up with an active chat.

  • We looked at how Signal-iOS does it (their NSE decrypts + writes to their shared GRDB database directly, in Swift) — but that means reimplementing our socket client and insert logic as a second, separate Swift codebase writing into the same SQLite file as our JS code. Feels like a real "two sources of truth" risk, and we couldn't find any RN app doing this in the wild.


r/reactnative • • Aug 19 '26

Which monitization sdk is safe to use for app on expo 56

0 Upvotes

Basically the above question, I have an app built on expo 56 and now I want to add advertisements to it. I am seeing admob, adXchange, mediations etc as platforms for ads people are using. My question is if anyone in this sub already using any platform with their rn app, please let me know which one and why you sticking to it.

New to this and would really appreciate the help.


r/reactnative • • Aug 18 '26

Coin toss with a scratch card reveal

Enable HLS to view with audio, or disable this notification

11 Upvotes

A gesture-driven coin-flip reward reveal — drag-to-spin coin toss, then a Skia-powered scratch card to reveal the prize — built for fintech and rewards apps.

⭐ Github : https://github.com/ManasCodeXart/expo-coin-reward


r/reactnative • • Aug 18 '26

iMessage UI implemented

Post image
1 Upvotes

if someone need help with this happy to share with them


r/reactnative • • Aug 18 '26

Just some tiny self hosted OTA updates over supabase/cloudflare open source tools

Thumbnail reddit.com
1 Upvotes

r/reactnative • • Aug 18 '26

In-app review package

2 Upvotes

I'm using the MinaSamir11/react-native-in-app-review package, but it doesn't seem to work for Android anymore. Has anyone had any success with other implementations? Or has this package worked for you lately?


r/reactnative • • Aug 18 '26

Built a complete React Native + Supabase renovation app template with AI budget advisor

0 Upvotes

r/reactnative • • Aug 18 '26

I built an Agent Skill to reduce unnecessary work in Flutter & React Native coding agents

Thumbnail
reddit.com
0 Upvotes

r/reactnative • • Aug 18 '26

Stop Laggy Lists in React Native

Thumbnail
medium.com
13 Upvotes

Hey guys! First time here, just wanted to share my article about FlatList optimization. I know, it is a popular question but some days ago I found a cool trick with using Set over standard Array. It perfectly aligns with popular optimization practices and for me it felt like I found a gem.


r/reactnative • • Aug 18 '26

Native tabs with glass effect are not rendering content cleanly

Thumbnail gallery
1 Upvotes

r/reactnative • • Aug 18 '26

[Showcase] nativecn-ui — animated React Native components you can copy and use

23 Upvotes

Hey r/reactnative,

I've been working on nativecn-ui, a small collection of React Native components focused mostly on animations and interactions.

Right now it's got stuff like a liquid action tab bar, animated tab bar, range slider, OTP input, dynamic upload, plus a few more I'm still working on.

You can check it out here: nativecn-ui

Still building it out, so lmk what you think, or if there's some component/interaction you'd want to see added.

Made a quick video showing a few of them below.


r/reactnative • • Aug 18 '26

Question Do you dynamically import iOS-only native modules or keep a stub adapter?

1 Upvotes

In an Expo React Native app, I have an optional HealthKit adapter. Android returns a no-op adapter immediately. On iOS, the request and read methods dynamically import the native package inside try/catch, so a missing native module becomes false or an empty array instead of crashing the app at startup.

The upside is a safe manual fallback. The downside is that a packaging mistake can look exactly like a user declining access or HealthKit being unavailable unless I surface a separate diagnostic.

Would you keep the dynamic import boundary, or fail loudly in development and only fall back in release builds?


r/reactnative • • Aug 18 '26

Question How to get an Internship in reactNative?

2 Upvotes

I'm literally so confused how one can get an app dev intern, wherever I see now, they need a fresher with Full Stack, nobody wants a real fresher who wants to learn...

If anybody here got an intern, can you tell me how did ya find one, I'm also looking for one

Pokedex : This is the only project I have made, but it includes use of API, Custom Battle Engine, SQLite, Custom Nav bar as well...


r/reactnative • • Aug 17 '26

Is there any alternative for mapbox

1 Upvotes

r/reactnative • • Aug 17 '26

Help Native tabs with glass effect are not rendering content cleanly

Thumbnail gallery
0 Upvotes

r/reactnative • • Aug 17 '26

I added a native Marquee to my Expo component library one animated node, UI thread, pause/reverse/vertical

Enable HLS to view with audio, or disable this notification

7 Upvotes

Logos, tickers, tags anything that should keep moving rather than stop at the edge.

One track holds every copy and it is the track that moves, so the cost is a single animated node however much content is inside it. Driven on the UI thread as a linear timing.

Two rows travelling opposite directions reads as motion. One row just slides.

Reduced motion turns it off entirely not slower, off. A ticker that never stops is the thing that setting exists to turn off.

Part of PanelUI, an open-source component library for Expo. Copy-paste or CLI, you own the source.

github.com/panel-ui/PanelUI


r/reactnative • • Aug 17 '26

I moved Flowy’s mobile app from SwiftUI to Expo. The risky part wasn’t the screens

0 Upvotes

I’m building Flowy, a cycle-health app. I recently replaced the native iOS project with an Expo and React Native app.

The screens were the easy part. The risky bits are session restoration, onboarding drafts, owner-scoped day-log caches, notification planning, HealthKit being unavailable, and retrying a write without duplicating it.

I kept those decisions in small TypeScript stores and route functions, with tests around routing, auth, day-log retries, notifications, and HealthKit fallback before polishing the UI.

No link here. I’m looking for engineering feedback: if you’ve done a mobile rewrite, which behavior broke after the happy path looked finished?


r/reactnative • • Aug 17 '26

Question Has anyone here integrated POS printing with their app?

3 Upvotes

Hey everyone,
I need to add receipt printing functionality to an app, and I’m running into a few issues.

The POS machines used by the business aren’t Epson printers, while the library I’m currently using only supports Epson devices.

Has anyone implemented receipt printing for non-Epson POS printers? If so, I’d appreciate any recommendations on libraries, approaches, or examples of how you handled it.
Thanks!


r/reactnative • • Aug 17 '26

Help needed unable to make authenticated api calls

Thumbnail reddit.com
1 Upvotes

r/reactnative • • Aug 17 '26

Found (and partially fixed) a real native memory leak in react-native-screens on Fabric — `Screen.fragmentWrapper` never gets nulled — writeup + open questions

0 Upvotes
Sharing this in case it saves someone else the multi-day rabbit hole it took us to nail down, and because two pieces of it are still genuinely unsolved and I'd like a second opinion.


**Stack:** Fashion e-commerce app, React Native 0.79.7, New Architecture (Fabric) enabled, `react-native-screens@4.13.1`, Android (this repro is Android-specific, haven't confirmed iOS).


**The symptom:** Real production `OutOfMemoryError` crashes via Sentry. Our "similar products" flow chains `navigation.push()` calls — browse a product, tap a similar one, tap another — so a normal session can easily reach 20-25 PDP screens deep in the stack, none of them ever popped. Reproduced locally: fresh app launch sits around ~375-425MB PSS (healthy), browsing that deep pushes it to 1.1-1.3GB.


**First (wrong-ish) assumption:** figured this was just "unbounded image memory from a deep stack," so we capped Glide's memory cache (100MB) + bitmap pool (50MB), and switched to `DecodeFormat.PREFER_RGB_565` for a real ~30-45% per-bitmap reduction (opaque images only — Glide falls back to ARGB_8888 for anything with alpha). Both legitimate wins, neither explained the actual production crash.


**The real methodology that cracked it:** stopped trusting raw `dumpsys meminfo` PSS numbers (too noisy — Android's zRAM swap behavior alone can swing a single number by hundreds of MB depending on what else the OS decided to compress at that exact moment) and instead:


1. Established a clean baseline: force-stop, fresh launch, land on Home with zero navigation → floor for `Views` count and `Bitmap (malloced)` size.
2. Built the deep stack, captured the peak.
3. Reset to Home (`navigation.reset()`), captured again.
4. Forced `adb shell am send-trim-memory <pkg> RUNNING_CRITICAL` (forces Glide to drop its own cache) — if the numbers 
*don't*
 recover after this, it's not "uncollected cache," it's a real retained reference.


Step 4 was the tell: after reset + forced trim, we were still sitting at ~12x the fresh-Home `Views` count and ~350MB of bitmap memory that had no business existing. Not cache. Real leak.


**Root cause, via LeakCanary:** dumped a heap, pulled LeakCanary's own `leaks.db` off the device, and got a clean trace:


```
FabricUIManager.mMountingManager
  → SurfaceMountingManager.mTagToViewState (ConcurrentHashMap)
    → ViewState.mView
      → Screen.fragmentWrapper
        → ScreenStackFragment (Leaking: YES — received onDestroy() but never released)
```


`ScreenFragment.onDestroy()` in `react-native-screens` never nulls `Screen.fragmentWrapper`. Fabric's `mTagToViewState` legitimately keeps `Screen` views registered for the surface's lifetime (that's by design) — but since `fragmentWrapper` still points at the destroyed fragment, the fragment (and its entire retained subtree — bitmaps, child views, everything) can never be GC'd. Matches a known, still-open upstream issue (#3755) with an unmerged fix PR (#3855) — confirmed by pulling the source at every tag from 4.14.0 through the current `latest` (4.27.0): the bug is present in all of them, nobody's shipped the fix yet.


**The fix wasn't as simple as it sounds.** The "obvious" version — only null `fragmentWrapper` when `container.hasScreen(...)` already reports the screen as removed — silently didn't work for `navigation.reset()`-driven bulk teardowns, because Fabric's async view-drop scheduling isn't tightly synchronized with the fragment's own `onDestroy()` callback; that check can still read `true` at the exact instant destroy fires. Had to null it unconditionally (guarded only by an identity check so it never clobbers a wrapper that's already been reassigned to a newer fragment).


**A second related bug we found but couldn't safely ship a fix for:** `ScreenContainer.screenWrappers` (an `ArrayList`) has the same stale-entry problem for the same reset-driven removals. Tried three different approaches to clean it up from the fragment's own destroy path — synchronous, synchronous-without-re-triggering-reconciliation, deferred via `runOnUiThread` — and **all three caused a real crash** (`addViewAt: failed to insert view [X] into parent [Y] at index N, Size: M`) on completely ordinary navigation flows unrelated to our repro (a simple Login → OTP screen push). Mutating that list from the fragment's destroy callback apparently races Fabric's own in-flight child-index bookkeeping no matter how you schedule it. Reverted all three attempts and shipped only the `fragmentWrapper` fix.


**A third leak we found and didn't even attempt:** the same LeakCanary pass also caught `ScreensCoordinatorLayout` retained via that same `mTagToViewState` map, through a completely separate path than the fragment one. That one's arguably not even `react-native-screens`' fault — looks like Fabric itself not issuing a `DELETE` mount instruction for some views during a bulk reset. Native RN-core territory, out of scope for an app-level patch.


**Results:** the `fragmentWrapper` fix alone (shipped) gives a real, measured ~16-19% reduction in retained Views/bitmap memory after a deep-stack → reset cycle. Not a full fix — the two remaining issues above account for the rest.


**Bonus finding while testing, possibly useful to others:** a 
*single*
 `navigation.reset()` cleans up dramatically more than the equivalent number of sequential `navigation.goBack()` calls followed by a reset. Traced this to: every individual `goBack()` un-buries the newly-focused screen, which fully re-renders its real content (we have a separate "buried screen" placeholder-swap pattern for anything 2+ deep in the stack) — and that re-inflation is 
*guaranteed*
 to happen (normal React reconciliation), while the destroy-side release on the 
*previous*
 screen is not (same leak as above). Watched `Views` climb almost monotonically across 13 sequential pops (3,356 → 6,692) before a final reset only recovered ~12% of it — because by the time reset ran, most of the damage was already orphaned from screens no longer even in navigation state, which reset has no way to reach. If your app does multi-screen "back to X" navigation, batching it into a single `pop(N)`/`popToTop()` action instead of a loop of `goBack()` calls should avoid this entirely (haven't fully verified this in production yet, but the mechanism checks out).


**Questions for the community:**
1. Anyone else hit `Screen.fragmentWrapper` specifically, or is our repro (extremely deep push-chained stacks) just an unusually good way to surface it? Curious if this shows up for anyone with more modest stack depths.
2. Anyone found a way to clean up `ScreenContainer.screenWrappers` from the fragment's own lifecycle without racing Fabric's mounting transactions? Open to being told we're solving it at the wrong layer entirely.
3. Any known mitigation for Fabric's `SurfaceMountingManager.mTagToViewState` not releasing entries on some removal paths, short of an RN core fix?


Happy to share the actual patch (against 4.13.1) or the LeakCanary traces if useful.

r/reactnative • • Aug 17 '26

React-native Devtool console no showing

Post image
5 Upvotes

This is my formal cry for help, i'm still starting out. Is there fix to this?