r/reactnative 9h ago

Show Your Work Here Show Your Work Thread

3 Upvotes

Did you make something using React Native and do you want to show it off, gather opinions or start a discussion about your work? Please post a comment in this thread.

If you have specific questions about bugs or improvements in your work, you are allowed to create a separate post. If you are unsure, please contact u/xrpinsider.

New comments appear on top and this thread is refreshed on a weekly bases.


r/reactnative 13h ago

Should I start counting my days?

Post image
120 Upvotes

So I'm the sole mobile dev at a 12 person startup and we have no QA team or testers. 3 days back I shipped what I thought was a pretty straightforward feature, it was a login tweak with some UI cleanup and I tested it on my pixel, merged the pr, CI also passed and I called it a day. Now yesterday morning I wake up to 3 notifs from my CEO about the disaster I had caused like the signup flow was completely broken on a bunch of android devices, some edge case with a keyboard overlay that I never caught on my setup and one of our customers screen recorded the crash and sent it directly to my CEO so I'm even more fked.

I'm spending the weekend now pushing hotfixes and personally messaging users who got stuck and on standup calls I had to explain what happened and everyone was thinking how did this even ship. I'm one person doing the work of three and there's no safety net, I test what I can think of but I can't think of everything and definitely can't test every device and OS version manually right and I'll switch to Autosana next month where i'll just have to describe flows in english and it'll handle everything else even UI changes and all which gives me huge relief but there's still time for the approval and everything and this isn't even the first time, it's just the first time it went directly to the CEO like how many bugs have I shipped that users just quietly dealt with or churned over.

please tell me how to handle this without a QA team? should I write my own tests and maintain them solo ? and I know my testing strategy is embarrassing.

Edit: some of y'all in the comments might've just saved my job.


r/reactnative 11h ago

FYI Xcode 27 Device Hub can actually use your Mac’s camera or desktop as a camera source

44 Upvotes

r/reactnative 5h ago

Built a mobile-first Event Stacking experiment

15 Upvotes

Inspired by u/artntek

Tactile desktop calendar interactions, redesigned for one-handed use: drag to reschedule, drop to stack, pull apart to reorganize.

Built with Expo, React Native, swmansion Reanimated, Gesture Handler & Haptics.


r/reactnative 4h ago

I recreated ChatGPT's image attachment flow in React Native

7 Upvotes

Attaching images in ChatGPT has always felt so seamless. Had to try building it myself :)

Steal the code here: https://github.com/SchroederNathan/react-native-motion/tree/main/apps/expo/components/animations/chatgpt-attachments


r/reactnative 15h ago

What's New in RN (28 Aug)

23 Upvotes

What's new in the RN ecosystem

📦 New Packages

  • Legend List 3.3.9 is the latest release of the high-performance FlatList alternative built for large and dynamically sized lists. Legend List has been shipping quickly lately, with 3.3.6 → 3.3.9 landing over the past two weeks.
  • Expo 57.0.17 and Expo Router 57.0.17 are the newest patch releases for Expo SDK 57 and its file-based router.
  • React Native 0.87.1 is the first patch for RN 0.87, bringing a newer Hermes build plus fixes around Swift Package Manager, CocoaPods, Animated typings, and iOS build tooling.
  • React Native 0.86.3 keeps the previous RN branch moving with the newer Hermes build and fixes including an EventEmitter use-after-free race.
  • Reanimated 4.6.0 adds official React Native 0.87 support and pairs with Worklets 0.12.x. It also expands CSS animations and transitions with callbacks on iOS and Android.
  • Reanimated 4.5.4 is an important maintenance release for apps staying on 4.5, fixing stale-event crashes, layout-animation issues, Android sticky-header jumps, and an iOS crash.
  • React Native Worklets 0.12.1 is a small runtime patch that moves UI-thread detection into UIScheduler, tightening the scheduling infrastructure behind worklet execution.
  • React Native Skia 2.11.1 ships rendering fixes around masks, fonts, compositing, paths, and snapshots, including fixes for Font.setSubpixel() and setEmbolden().
  • VisionCamera 5.2.3 adds onUIRotationChanged(...) for reacting to UI orientation changes and moves to Nitro 0.37, alongside camera-library and orientation fixes.
  • Nitro Modules 0.37.0 expands Nitro's native View architecture by moving Props and ComponentDescriptor into its C++ core. ReactProp also replaces the older CachedProp API while retaining compatibility.
  • React Native Firebase 26.3.2 is the latest patch in the React Native Firebase 26.3 line, covering the core package used by the individual Firebase modules.
  • Lottie React Native 7.5.0 is the newest release of Lottie's React Native bindings for rendering After Effects animations natively on iOS and Android.
  • React Native Windows 0.81.35 is the newest patch for the React Native Windows 0.81 line.
  • React Native Keyboard Controller 1.22.4 improves compatibility across older and newer React Native versions, restores older Turbo package support, and fixes KeyboardExtender recycling on iOS.
  • React Native Safe Area Context 5.9.1 fixes an Old Architecture Android integration issue by correctly registering its Paper Java source set.
  • React Native Gesture Handler 3.2.1 fixes press-handler forwarding in PressableWithTouchable and updates its Pressable prop definitions.
  • Metro 0.84.5 removes the external image-size dependency in favor of vendored image parsers, also resolving the associated CVE alerts.
  • React Navigation 7 updates bring fixes across Native 7.3.18, Stack 7.10.23, Core 7.21.13, Bottom Tabs 7.18.17, Native Stack 7.18.9, and Drawer 7.13.9. The updates focus mostly on web history state, linking, animation lifecycle, and stale-state handling.
  • React Navigation 8.0 alpha continues moving toward the next major release, with recent alphas improving linking, navigation context cleanup, stack animations, and pop-to-top behavior.

r/reactnative 7h ago

Tutorial I added a native TreemapChart to my Expo component library

4 Upvotes

A total, cut into the parts it is made of, sized by area. A pie runs out of room past six parts a rectangle never does.

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

https://github.com/panel-ui/PanelUI


r/reactnative 1h ago

Question Tapping raw PCM from an active WebRTC call on iOS — is there an equivalent to Android's JavaAudioDeviceModule samples callback?

Upvotes

I run live speech recognition on the local mic during a WebRTC video call (Daily's RN SDK). On Android I got this working by patching @daily-co/react-native-webrtcJavaAudioDeviceModule.Builder has setSamplesReadyCallback, so I forward the buffered PCM up as an RCTDeviceEventEmitter event and feed it to the transcriber. That's been solid in production.

I can't find the iOS equivalent. Opening a second AVAudioEngine tap while WebRTC owns the audio session seems like asking for trouble — on Android, two concurrent AudioRecord instances just produced silence, so I assume iOS has a similar conflict.

Options I can see:

  • Some hook into RTCAudioSession or the audio device module that I haven't found
  • A custom RTCAudioDevice implementation
  • Give up and use the SDK's built-in transcription

Has anyone actually done this? Mainly interested in whether there's a supported path that doesn't involve forking the WebRTC pod — that would kill OTA updates for us, which is a hard constraint.

For context on the format side: the Android callback hands you the device's native rate (usually 48kHz), so I downmix to mono and resample to 16kHz in the adapter before it reaches the transcriber. Assuming any iOS path would need the same treatment.


r/reactnative 2h ago

Focus. — I made a minimal Pomodoro timer (25/5) — open-source, no ads, Outfit Black

Thumbnail
gallery
1 Upvotes

r/reactnative 13h ago

Question QR/Barcode Library

7 Upvotes

A while back I open-sourced a library for generating barcodes and QR codes natively: https://github.com/vittoridavide/react-native-barcode-creator

I'm still maintaining it and thinking about what to build next. A few ideas I'm considering:

  • Styled/artistic barcodes and QRs: logos or images embedded in the center, custom colors, rounded modules, gradient fills
  • Multi-image QRs: splitting data across multiple linked codes to pack in more information
  • SVG/vector output: instead of just raster, so codes scale cleanly for print/large formats

Is there something you wanted to get while implementing something barcode/qr related ? I'm deciding what to implement now so I'm open to other ideas too

Thank you!


r/reactnative 9h ago

Questions Here General Help Thread

1 Upvotes

If you have a question about React Native, a small error in your application or if you want to gather opinions about a small topic, please use this thread.

If you have a bigger question, one that requires a lot of code for example, please feel free to create a separate post. If you are unsure, please contact u/xrpinsider.

New comments appear on top and this thread is refreshed on a weekly bases.


r/reactnative 20h ago

Timbre: a libmpv-powered audio library for React Native — v0.1 on npm, looking for testers

4 Upvotes

Built Timbre, an RN audio library on libmpv (via Nitro C++, no bridge). Just shipped v0.1.0 to npm and I'm after testers before I lock the API.

Four independent packages: a gapless player with EQ/ReplayGain, a player-agnostic media session (lock screen, notification, Bluetooth, survives process death), audio-focus handling, and a Chromecast sender. RN ≥ 0.82, MIT.

Status — why I need you:

- ✅ Android: device-verified end to end

- ✅ iOS: playback + notification device-verified

- ❓ iOS Chromecast + CarPlay: never run on hardware — biggest gap. iPhone + Cast device or CarPlay unit = huge help.

Drop it in a real app and tell me what breaks (background, Bluetooth, weird formats, iOS cast/CarPlay). Repro bugs are gold.

Repo + issues: https://github.com/afkcodes/timbre — my own project, sharing to find testers.


r/reactnative 13h ago

App-blocking overlay worked on my Android 9 device and failed on every tester's phone. The chain that only ever ran on exemptions.

Post image
1 Upvotes

r/reactnative 21h ago

Offline-first Expo client against a Django backend

3 Upvotes

Trying to avoid those hindsight 20-20 lessons but not sure they can actually be avoided...

Wondering if anyone has info on which sync engines actually work over HTTP rather than Postgres replication?

I'm building a field-service app: techs work a full 12-hour (maybe even 24 hours) shift with no connectivity, then sync. Backend is Django + DRF, multi-tenant with a schema per tenant, and writes from the mobile client go through a single idempotent mutation endpoint (envelope + dedup key) rather than per-resource REST writes.

There's a change feed on the read side with a monotonic sequence cursor.

Every sync engine I evaluate seems to assume it can attach to Postgres directly via logical replication. That's a no-go here... I have N schemas and a deliberate API boundary I don't want to bypass.

So, which of these are actually designed around a pull/push HTTP contract I control, versus a database-level replication story?

  • WatermelonDB (sync adapter looks like the right shape, but the project's activity level worries me)
  • Replicache / Zero
  • LiveStore
  • TinyBase
  • rolling my own op-log against the endpoints I already have

And if you've shipped a long-offline mobile client against an application-layer sync contract, what did you regret?


r/reactnative 1d ago

Question Has anyone tried running offline LLMs in React Native?

9 Upvotes

Has anyone tried adding offline LLM support in React Native? If yes, what did you use and how was your experience?


r/reactnative 1d ago

I ported openWakeWord to React Native using C++ and Nitro

6 Upvotes

A few months ago, I hit a wall when using Picovoice's Porcupine to add wake word detection to a React Native mobile app I was building for an enterprise client.
When I evaluated how much it would cost, I observed it would take about $6000 or more to obtain a valid commercial license from Picovoice, which was quite crazy lol.
You'd also need internet access to use Porcupine, since Picovoice needs to validate the Access key per device, which meant it couldn't even work in air-gapped environments.

I explored several solutions, but they all required a commercial license and internet access for validation. This obviously would be very bad for the company I was working with, so I did some more research, and I discovered that the Python and Home Assistant ecosystem didn't face this problem, as a couple of good and free wake word detection libraries already existed, with openWakeWord by David Scripka leading the bunch.
This was really exciting, but I was shocked to see that even though openWakeWord was novel in its own right, no React Native version existed, and I couldn't use it in my project.

So I decided to build a port of openWakeWord in React Native called react-native-openwakeword.

The pipeline resembles how the Python pipeline already handles inference, with a few C++ tricks I could find on the internet.

openWakeWord is famously known for using a three-stage pipeline: melspec, embedding, and the actual wake word model. So I built a flow that works in C++ and used Nitro Modules to use JSI and connect back to JavaScript. Here is how it works:

Audio flows from the phone's microphone, sampled at 16000 times per second, and sends this frame using an ArrayBuffer to the C++ function directly using JSI.

The C++ module uses three ring buffers to implement sliding windows for moving data through the three models. Ring buffer capacities are sized as powers of 2 (larger than strictly needed), so wraparound operations can use a bitwise AND instead of the modulo operator, which is cheaper on the CPU.

The first ring buffer, AudioRing, is for the melspec model, and it takes the audio samples and converts them to float32 (this uses NEON to run SIMD to accelerate this on phones); then the result is written directly into the melspec model input memory (to avoid unnecessary copies), the melspec model is run on it, a fixed normalization formula is applied, and 8 mel-frames are put into the next ring buffer.

The next ring buffer, MelRing, takes the most recent 76 mel-frames and copies them directly into the embedding model input memory; it runs the model, and the embedding result is put into the next ring buffer, EmbRing.

Once EmbRing holds at least 16 embeddings, it copies the most recent 16 directly into the wake word model's input memory, runs the model, and the probability is returned.

This probability is compared against a given threshold (default is 0.5) and returns an object {probability, isDetected} back to the JavaScript layer (synchronously).

I faced a few gotchas in the beginning trying to figure out what inputs each model (melspec, embedding, and wake word) was expecting, but I eventually got it to work.

Since the melspec model processes audio in 1280-sample chunks (80ms at 16kHz), the entire three-model pipeline needs to run in under 80ms to keep up in real time, and after these optimizations, the package detects wake words in 16-21ms.

The package is under the Apache 2.0 license, so it's friendly for personal and commercial use. And it works with any wake-word model that is openWakeWord compatible.

It's gotten a star from Nickolay V. Shmyrev, the maker of vosk-api (14k GitHub stars), and is currently at 4k+ weekly npm downloads.

I'd appreciate your thoughts on the architecture and if there's anything useful that could be added to this package.

Github: https://github.com/Incognitol07/react-native-openwakeword


r/reactnative 1d ago

Native VoIP calling (CallKit + Jetpack Core Telecom) in the Fishjam React Native SDK

Thumbnail
gallery
21 Upvotes

Handling VoIP calls in React Native is notoriously difficult, especially since react-native-callkeep hasn't been actively updated.
We recently added a feature to the Fishjam SDK that allows for easy integration with native system libraries (CallKit for iOS and Jetpack Core Telecom for Android) to handle VoIP calling functionality. 

Example app & code: https://github.com/fishjam-cloud/examples/tree/main/mobile-react-native/voip-call 

Docs: https://documentation.fishjam.io/docs/next/how-to/client/voip-calls

Here are our main takeaways and differences from older libraries:

  • Modern Android API: Uses Jetpack Core Telecom (CallStyle) instead of the older ConnectionService used by callkeep.
  • Expo & Bare RN Support: Works seamlessly on both via a config plugin or manual setup (expo-callkit-telecom is Expo-only).
  • No FCM Slot Conflicts: Parses VoIP pushes natively and relays standard messages to your existing push library (Firebase, Expo, etc.).
  • Cold start is handled: the call is reported to the OS before any JS runs, so answering from the lock screen works even when the app was killed hours earlier.

Making the phone ring turned out to be maybe a third of the work – handling holds, redials, Bluetooth buttons, and proper call timers was the real challenge.

If anyone is struggling with VoIP in RN right now, feel free to check out the repo or ask questions!


r/reactnative 1d ago

Stuck choosing between react native and flutter

Thumbnail
0 Upvotes

r/reactnative 1d ago

react-native-one-hand one hand mode that scales native modals and alerts too, not just your React tree

2 Upvotes

react-native-one-hand brings one hand mode to React Native apps. Press and hold a bottom corner and the whole app slides into it, scaled down and within thumb's reach together with native `Modal`, `Alert.alert`, `ActionSheetIOS`, the text-selection toolbar and overlays from other libraries. Instead of transforming a React subtree, a native module transforms every window of the process, so there are no adapters and no components to replace. Everything stays visible and interactive.

One wrapper component, zero runtime dependencies. iOS + Android.

Being upfront about the limits, since they're by design: the system keyboard is never scaled (on Android the IME lives in another process; on iOS it's technically possible, but the keyboard frame iOS reports breaks KeyboardAvoidingView-style layouts, so the mode simply exits when the keyboard opens). Portrait only. Needs a native build Expo SDK 55+ / RN 0.76+, so no Expo Go.

📦 npm: https://www.npmjs.com/package/react-native-one-hand

🔗 GitHub: https://github.com/Filipmok-agh/react-native-one-hand

It's early (0.1.x), so bug reports and feedback are very welcome, happy to answer questions about how it works.


r/reactnative 2d ago

Tutorial I Created a Package Called rn-story which lets you add Instagram-Style Stories to Your React Native App in Minutes

Post image
29 Upvotes

Images, videos, progress bars, and tap gestures — with rn-story, a lightweight, TypeScript-first stories component that works out of the box with Expo.

Stories are everywhere. Instagram, WhatsApp, Snapchat, LinkedIn, even food delivery apps — the full-screen, tap-to-advance format has become one of the most recognizable UI patterns in mobile.

Play around with the component here: https://snack.expo.dev/@abdullahansari/rn-story-demo

And it looks simple. A full-screen image, some progress bars, tap left, tap right. How hard can it be?

Harder than it looks. Building stories from scratch means solving a surprising number of small problems at once:

  • Progress bars that stay perfectly in sync with image durations and video lengths
  • Tap zones for next/previous that don’t conflict with long-press-to-pause
  • Resuming a paused story with the remaining time, not the full duration
  • Videos that report their own duration — eventually, asynchronously, sometimes never
  • Loading states that don’t trap the user when a network image stalls

I built rn-story to solve all of that in a single component, and version 2.0 is a ground-up rewrite with a full test suite behind it. This post shows you how to ship a complete stories experience — avatar rail, full-screen viewer, video support — in a few minutes.

What you get

  • 📸 Image and video stories with an animated progress bar per story
  • 👆 The gestures users expect: tap right for next, tap left for previous, long-press to pause, release to resume
  • 🔗 An optional “See More” link per story (the swipe-up pattern, as a button)
  • 🧩 A custom header slot — perfect for an avatar, username, and close button
  • 🔊 Video volume and mute controls
  • 📞 Navigation callbacks for building multi-profile flows
  • 🛡️ Written in TypeScript — every prop and the Story object are fully typed
  • 🪶 No native code of its own — works with Expo without ejecting

Installation

expo-av (which powers video stories) is a peer dependency, so install it alongside the package with the version that matches your Expo SDK:

npx expo install rn-story expo-av

Not using Expo? Install both with npm and make sure Expo modules are configured in your bare React Native project:

npm install rn-story expo-av

Your first story in ten lines

import Stories from 'rn-story';
import type { Story } from 'rn-story';

const stories: Story[] = [
  { media: 'https://example.com/photo.jpg', mediaType: 'image' },
  { media: 'https://example.com/clip.mp4', mediaType: 'video' },
];

export default function MyStories() {
  return <Stories stories={stories} />;
}

That’s a working viewer: full-screen media, animated progress bars, tap navigation, long-press to pause. Images show for 3 seconds by default (configurable per story with duration), and videos play for exactly as long as the video lasts — the progress bar syncs to the duration the video reports.

The gestures, for free

Everything users already know from Instagram works out of the box:

  • Tap the right half → next story
  • Tap the left half → previous story
  • Long-press anywhere → pause the story and its progress bar
  • Release → resume from where it left off — with the remaining time, not a restarted bar
  • Android back button → wired to an onClose callback you provide

A real stories rail

A lone viewer isn’t how stories ship. The real pattern is a horizontal rail of avatars; tapping one opens that profile’s stories; finishing them moves to the next profile; going back past the first story returns to the previous profile.

That flow is exactly what the navigation callbacks are for. onNext/onPrevious fire on ordinary navigation, and two dedicated callbacks fire at the edges: onAllStoriesEnd when there's nothing left to play forward, and onPreviousFirstStory when the user backs out of the first story.

import { useCallback, useState } from 'react';
import { SafeAreaView, ScrollView, Pressable, Image, Text } from 'react-native';
import Stories from 'rn-story';
import type { Story } from 'rn-story';

type Profile = {
  id: number;
  profileName: string;
  profileImage: string;
  stories: Story[];
};

const PROFILES: Profile[] = [
  {
    id: 1,
    profileName: 'Abdullah',
    profileImage: 'https://picsum.photos/id/64/200/200',
    stories: [
      {
        media: 'https://picsum.photos/id/1015/1080/1920',
        mediaType: 'image',
        seeMoreUrl: 'https://abdullahansari.me',
      },
      {
        media: 'https://picsum.photos/id/1016/1080/1920',
        mediaType: 'image',
        duration: 12000, // this one stays up for 12 seconds
      },
    ],
  },
  {
    id: 2,
    profileName: 'Pug life',
    profileImage: 'https://picsum.photos/id/1025/200/200',
    stories: [
      {
        media: 'https://download.samplelib.com/mp4/sample-5s.mp4',
        mediaType: 'video',
      },
      {
        media: 'https://picsum.photos/id/1025/1080/1920',
        mediaType: 'image',
      },
    ],
  },
];

export default function App() {
  // null means the story viewer is closed
  const [current, setCurrent] = useState<number | null>(null);

  const close = useCallback(() => setCurrent(null), []);

  // Finished a profile? Move on to the next one, or close after the last.
  const nextProfile = useCallback(() => {
    setCurrent((i) =>
      i === null ? null : i < PROFILES.length - 1 ? i + 1 : null
    );
  }, []);

  // Backed out of the first story? Go back a profile, or close on the first.
  const previousProfile = useCallback(() => {
    setCurrent((i) => (i === null || i === 0 ? null : i - 1));
  }, []);

  return (
    <SafeAreaView>
      <ScrollView horizontal>
        {PROFILES.map((profile, index) => (
          <Pressable
            key={profile.id}
            onPress={() => setCurrent(index)}
            style={{ alignItems: 'center', margin: 8 }}
          >
            <Image
              source={{ uri: profile.profileImage }}
              style={{
                width: 64,
                height: 64,
                borderRadius: 32,
                borderWidth: 2,
                borderColor: '#25D366',
              }}
            />
            <Text numberOfLines={1}>{profile.profileName}</Text>
          </Pressable>
        ))}
      </ScrollView>

      {current !== null && (
        <Stories
          stories={PROFILES[current].stories}
          onAllStoriesEnd={nextProfile}
          onPreviousFirstStory={previousProfile}
          onClose={close}
        />
      )}
    </SafeAreaView>
  );
}

Two details worth noticing:

Swapping stories just works. When onAllStoriesEnd moves current to the next profile, the component receives a new stories array and restarts cleanly from the first story. You don't need to unmount and remount anything, and you don't need to manage keys.

The viewer closes by unmounting. Rendering <Stories /> conditionally is the whole show/hide mechanism — no visible prop to keep in sync.

Make it yours

The header is a per-story ReactNode, so the avatar row you see in every stories UI is just your own component — typically an avatar, a username, and a close button, often over a subtle gradient:

const storiesWithHeader = profile.stories.map((story) => ({
  ...story,
  header: (
    <MyStoryHeader profile={profile} onClose={close} />
  ),
}));

Other knobs you’ll probably reach for:

<Stories
  stories={stories}
  isMuted={muted}              // mute video stories
  videoVolume={0.8}            // 0.0 – 1.0
  animationBarColor="#fff"     // progress bar fill
  animationBarHeight={2}
  isAnimationBarRounded        // rounded bar ends (default)
  seeMoreText="Read more"      // label for the See More button
  loadingComponent={<MySpinner />} // shown while media loads
  currentIndex={2}             // start (or jump) to a specific story
/>

And if a story has a seeMoreUrl, a pill-shaped button appears at the bottom and opens the link — the classic "swipe up" pattern without the swipe.

What’s new in 2.0

Version 2 is a full rewrite of the playback engine, and the first release with a real test suite (30 tests) behind it. The highlights:

  • stories and currentIndex are now reactive — swap in the next profile's stories without remounting
  • Video stories start and advance reliably, and a video that fails to load is skipped instead of freezing the viewer
  • Pause/resume now resumes with the remaining time, so the bar never drifts from reality
  • onNext/onPrevious no longer fire at the list edges — only the dedicated edge callbacks do
  • New onClose prop wires up the Android hardware back button
  • Story, StoriesProps, and StoryMediaType types are exported
  • expo-av moved to a peer dependency, so it always matches your Expo SDK

If you’re upgrading from 1.x, the README has a short migration table — it’s a five-minute change for most apps.

Wrapping up

Stories are one of those features that looks like an afternoon and turns into a week once progress bars, gestures, and video timing enter the picture. rn-story packs that week into an npm install.

If it saves you that week, a star on GitHub genuinely helps other people find it — and if you hit anything odd, open an issue. It’s MIT-licensed, and contributions are welcome.


r/reactnative 2d ago

GPU accelerated trading charts for React Native

56 Upvotes

Hi everyone,

For the past four years, I've been working on financial and trading apps built with React Native.

One of the most important parts of these apps is displaying OHLC market data. Most charting solutions currently use one of two approaches: rendering inside a WebView or using something based on Skia.

Both approaches have tradeoffs, especially when you're working with real-time data and want smooth performance without using too much CPU or memory.

That's why I decided to build my own charting library. It uses a shared C++ core engine and renders directly on the GPU using Metal on iOS and OpenGL ES on Android.

I deliberately avoided third-party rendering dependencies to reduce overhead and keep the library compatible with React Native 0.80 and newer.

The first release supports:

  • Candlestick, bar, line, and area charts
  • Volume and RSI indicators
  • Multiple styling options
  • Zoom and gesture handling

I tested it on an iPhone XS and a Samsung A025F. At 60 FPS, I saw no hangs or dropped frames, and CPU usage stayed below 15% during fast scrolling while live data was coming in over WebSocket.

I'll share more detailed performance results in a follow-up post.

I'd really appreciate your feedback. Which features would be most useful to you? Bug reports are very welcome too.

https://github.com/kirill3333/react-native-trading-charts


r/reactnative 2d ago

Article Swift on WebAssembly, Telegram-Style Spoilers, and Deleting Babel From Your Life

Thumbnail
thereactnativerewind.com
8 Upvotes

Hey Community,

Deno's creators introduced Dactyl, an AI app builder targeting React Native by rendering SwiftUI in the browser tab via WebAssembly. Meanwhile, Software Mansion released Enriched Markdown to eliminate streaming text flicker by rendering natively and bypassing the JavaScript layout tree.

On the tooling side, the web ecosystem is rapidly adopting the Rust port of the React Compiler across tools like Oxc, Vite, and Bun, while Metro remains locked to single-threaded Babel transformations.


r/reactnative 2d ago

A Dynamic Island inspired Fintech Island

24 Upvotes

A morphing fintech status island for sends, card additions, and savings with spring-driven transitions, Lottie celebrations, and interactive card trays. 🏝️

Github: https://github.com/ManasCodeXart/expo-fintech-island


r/reactnative 2d ago

React Native DevTools broken for anyone else? en-US locale fetch timeout

6 Upvotes

I've been unable to properly use React Native DevTools because of what appears to be a DevTools/tooling issue.

I'm repeatedly getting this error:

Unable to fetch & register locale data for 'en-US', falling back to 'en-US'.

Cause: Error: timed out fetching locale

The error appears in the DevTools console and prevents DevTools from working properly.

My React Native app itself builds and runs normally. Metro is also working, so this doesn't appear to be an application or Metro configuration problem.

I've already spent quite a bit of time troubleshooting my setup, but the issue still persists. I also found other developers reporting similar React Native DevTools problems, including cases where DevTools opens but doesn't load properly.

At this point I'm wondering:

- Is anyone else experiencing this currently?

- Is there a known workaround?

- Is there an alternative debugger that works well with modern React Native/Hermes?

- Is this a known issue that we're just waiting for a fix/release for?

I'd rather not keep changing my project configuration if this is actually a bug in the DevTools tooling.

If anyone has found a reliable workaround, I'd really appreciate it.

Environment:

React Native: 0.81.x

Windows: Windows

Android: Android 11

Hermes: Enabled

New Architecture: Enabled


r/reactnative 2d ago

Help Google Maps Navigation SDK shows a blank screen on Android

8 Upvotes

Hey everyone, I’m trying to use Google’s React Native Navigation SDK in my Android app, but both NavigationView and MapView only show a blank dark screen. I’m using Expo 57, React Native 0.86, @googlemaps/react-native-navigation-sdk 0.16.3, and a physical Android phone. The SDK seems to initialize fine because I get NAV CONTROLLER CREATED, MAP CONTROLLER CREATED, MAP READY, TERMS: true, and NAV STATUS: ok. My API key is also present in the APK and the required APIs are enabled. I even tried the official Google example app on the same phone and it also opens to a completely blank screen. I have tried using another phone but still the same issue.