— The stack

Keeping a React Native app at a real 60fps.

React Native gets a bad reputation for jank. Most of it is avoidable. Here are the specific habits that keep UltraFit360 scrolling at 60fps on mid-range Android phones.

4 min readUpdated 2026-06-02By Aryan Singh Pokharia, Founding Member & Lead Developer
Colourful lines of code on a screen, representing React Native performance workAptixLabs · 2026-05-29

React Native is fast enough for almost any consumer app — the jank people complain about usually comes from a handful of avoidable mistakes, not the framework. UltraFit360 holds 60fps on mid-range Android phones because the studio treats performance as a habit, not a final-week firefight.

Lists are the number-one culprit

Most RN jank is a list rendering too much. The studio uses FlashList over FlatList for any scrolling collection, gives every row a stable key, and keeps row components pure with memoisation. A workout history with hundreds of entries scrolls as smoothly as ten because only the visible rows are ever mounted.

Move work off the JS thread

Animations driven from JavaScript stutter whenever the JS thread is busy. The studio runs all gesture and animation work on the native thread via Reanimated, so a sheet keeps sliding smoothly even while the app is fetching data or decoding an image in the background.

The performance checklist

  • FlashList for every scrolling list; never map a large array into a ScrollView
  • Reanimated for animations — keep them on the UI thread
  • Memoise row components and expensive selectors
  • Resize images to display size before bundling — never ship a 4000px image into a 120px avatar
  • Profile on a real mid-range Android device, not a flagship iPhone

The benchmark device tells the truth

A flagship iPhone makes any app look smooth and lies to you about performance. We benchmark on a three-year-old mid-range Android instead, because that is closer to what most users actually hold. If a list scrolls cleanly there, it scrolls cleanly everywhere; if it stutters there, real users are already feeling it. Testing on the best hardware you own is how performance problems hide until the reviews arrive.

The three fixes that solve most jank

  • Use a windowed list (FlashList) for anything scrollable — never map a big array into a ScrollView
  • Run animation and gesture work on the native thread with Reanimated, off the JS thread
  • Resize images to display size before bundling — a 4000px image in a 120px avatar is pure waste

Have a project like this?

The studio is taking on a small number of partners. Tell us what you're building — we reply within a working day.

Start a conversation