— 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 readPublished 2026-05-29By AptixLabs studio
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

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