RORK LABJP
PLAY — Google Play's target API level 36 requirement took effect yesterday, August 31. From today, new apps and updates must target Android 16VISIBILITY — Apps still on API 35 stay listed but disappear for users on newer Android versions. No error is raised; new installs simply fade, which makes the change easy to missEXTENSION — If you missed the deadline, an extension through November 1, 2026 can be requested in Play Console — best filed alongside a concrete migration planAPPLE — On the Apple side, the event lands September 9 and iOS 27 is reported to ship September 14. Testing generated apps on iOS 27 hardware before release week is time well spentEXPO — Expo released expo-paste-input on August 28, a native module that brings image, GIF, and sticker paste to React Native TextInputEAS — EAS Observe reached general availability on August 20, putting crash and performance monitoring on the same EAS platform as builds and updatesPLAY — Google Play's target API level 36 requirement took effect yesterday, August 31. From today, new apps and updates must target Android 16VISIBILITY — Apps still on API 35 stay listed but disappear for users on newer Android versions. No error is raised; new installs simply fade, which makes the change easy to missEXTENSION — If you missed the deadline, an extension through November 1, 2026 can be requested in Play Console — best filed alongside a concrete migration planAPPLE — On the Apple side, the event lands September 9 and iOS 27 is reported to ship September 14. Testing generated apps on iOS 27 hardware before release week is time well spentEXPO — Expo released expo-paste-input on August 28, a native module that brings image, GIF, and sticker paste to React Native TextInputEAS — EAS Observe reached general availability on August 20, putting crash and performance monitoring on the same EAS platform as builds and updates
Articles/Dev Tools
Dev Tools/2026-03-15Intermediate

Getting Started with Latest Performance Optimization Techniques in Expo SDK 55

Comprehensive guide to Expo SDK 55's Hermes V1, EAS build caching, and modal improvements. Learn the latest performance optimization techniques with implementation examples.

Expo194React Native234Performance25Hermes8OptimizationMobile Development4

Expo SDK 55: The Performance Revolution

Released in February 2026, Expo SDK 55 is more than a minor update—it's a major breakthrough for mobile app performance. The most significant change is that Hermes V1 is now the default JavaScript engine. This means all Expo apps automatically benefit from substantial performance improvements.

Compared to traditional JavaScript engines, Hermes V1 offers significantly faster execution and reduced memory consumption. This is particularly impactful on low-spec Android devices. Additionally, new features like Expo Observe, EAS build caching, and the upgraded react-native-screens enhance both development experience and app quality.


Hermes V1 Engine: Performance Gains and Implementation

Real Benefits of Hermes V1

Hermes V1 delivers major improvements across multiple dimensions:

ImprovementEffect
Execution Speed15-25% faster than previous engines
Memory Usage~30% reduction in initialization memory
App Startup500ms to 1 second faster startup time
ES6 SupportFull support for async/await, const/let, and class syntax

Hermes V1 works by precompiling JavaScript to bytecode, minimizing runtime parsing overhead. This approach is especially powerful on resource-constrained Android devices.

Standard Configuration in Expo SDK 55

With Expo SDK 55, Hermes V1 is automatically enabled. Verify your Expo version:

expo --version
# Output example: 52.0.0 (SDK 55 compatible)

You can also explicitly configure Hermes in app.json:

{
  "expo": {
    "plugins": [
      [
        "expo-build-properties",
        {
          "android": {
            "usesCleartextTraffic": false,
            "enableHermes": true
          },
          "ios": {
            "deploymentTarget": "13.0"
          }
        }
      ]
    ]
  }
}

After enabling Hermes, APK size typically reduces by 2-3MB thanks to bytecode optimization.


EAS Build Caching: 3x Development Speed Increase

Time Savings with Caching

EAS build caching reuses previous build results when dependencies and configurations remain unchanged. The impact is dramatic:

  • Initial build: 10-15 minutes
  • With cache: 3-5 minutes (70% reduction)

For CI/CD pipelines with frequent builds, this translates to tens of hours saved monthly.

Configuration and Usage

EAS caching is available by default in EAS Build v2+. To maximize efficiency:

# eas.json configuration example
{
  "build": {
    "production": {
      "node": "20.10.0",
      "npm": "10.2.4",
      "cache": {
        "cacheDisabled": false,
        "customPaths": [
          ".next",
          "build",
          "dist"
        ]
      }
    }
  }
}

Use commands to leverage caching:

eas build --platform ios --cache
eas build --platform android --cache

Cache persists for 14 days, making it effective for rebuilds within that window.


Modal Improvements and react-native-screens 4.23.0

Why Modal Optimization Matters

Rork apps frequently use modals (bottom sheets, dialogs, navigation stacks). With react-native-screens 4.23.0, native screen lifecycle management improves dramatically:

  • Reduced jank during modal transitions
  • Eliminated memory leaks
  • Smooth animations

Implementation Example: Bottom Sheet

Here's a modern bottom sheet implementation using react-native-screens:

import { NavigationContainer } from '@react-navigation/native';
import { createNativeStackNavigator } from '@react-navigation/native-stack';
import { GestureHandlerRootView } from 'react-native-gesture-handler';
import BottomSheet from '@gorhom/bottom-sheet';
 
const Stack = createNativeStackNavigator();
 
export default function ModalScreen() {
  const [isOpen, setIsOpen] = React.useState(false);
  const snapPoints = React.useMemo(() => [200, 400], []);
 
  return (
    <GestureHandlerRootView style={{ flex: 1 }}>
      <NavigationContainer>
        <Stack.Navigator
          screenOptions={{
            presentation: 'modal',
            animationEnabled: true,
            cardStyle: { backgroundColor: 'transparent' },
          }}
        >
          <Stack.Group>
            <Stack.Screen name="Home" component={HomeScreen} />
          </Stack.Group>
          <Stack.Group
            screenOptions={{
              presentation: 'transparentModal',
              cardOverlayEnabled: true,
              cardStyle: { backgroundColor: 'rgba(0,0,0,0.5)' },
            }}
          >
            <Stack.Screen name="Modal" component={ModalContent} />
          </Stack.Group>
        </Stack.Navigator>
      </NavigationContainer>
      
      {isOpen && (
        <BottomSheet snapPoints={snapPoints} onClose={() => setIsOpen(false)}>
          <View style={{ flex: 1, padding: 16 }}>
            <Text>Bottom sheet content</Text>
          </View>
        </BottomSheet>
      )}
    </GestureHandlerRootView>
  );
}

With version 4.23.0, modal stack memory management is automated, preventing leaks even with multiple nested modals.


Expo Observe: Production Performance Monitoring

What is Expo Observe?

Expo Observe (in private preview) monitors real-world app performance through a real-time dashboard, collecting:

  • Frame rate (FPS)
  • Memory usage trends
  • CPU and battery consumption
  • Network request latency
  • Custom metrics

Enabling and Configuring Expo Observe

Initialize Expo Observe by registering your project with EAS Account:

eas update:configure
expo prebuild --clean

Then initialize the SDK in your app code:

import { useExpoObserve } from 'expo-observe';
 
export default function App() {
  React.useEffect(() => {
    // Start performance monitoring
    const observer = useExpoObserve();
    
    // Record custom metrics
    observer.recordMetric('user_action_duration', 1250);
    observer.recordMetric('api_response_time', 350);
    
    return () => observer.cleanup();
  }, []);
 
  return <MainApp />;
}

Data uploads to the EAS Dashboard, allowing you to track performance trends over any time period.


Android Blur Optimization: RenderNode API Adoption

Background Blur Processing Evolution

For glassmorphism effects in Rork apps, Expo SDK 55 now leverages the RenderNode API on Android 12+, eliminating complex framebuffer operations and enabling GPU optimization.

Performance improvement:

EnvironmentProcessing TimeMemory
Previous Approach16ms/frame4.5MB
RenderNode API4ms/frame1.2MB

Implementation Example

Using expo-blur with the latest approach:

import { BlurView } from 'expo-blur';
import { View, Text, StyleSheet } from 'react-native';
 
export default function BlurExample() {
  return (
    <View style={styles.container}>
      <Image
        source={{ uri: 'https://example.com/bg.jpg' }}
        style={styles.backgroundImage}
      />
      
      <BlurView intensity={90} style={styles.blurContainer}>
        <View style={styles.content}>
          <Text style={styles.title}>Modal Content</Text>
          <Text>Fast rendering for smooth UI</Text>
        </View>
      </BlurView>
    </View>
  );
}
 
const styles = StyleSheet.create({
  container: {
    flex: 1,
    justifyContent: 'center',
    alignItems: 'center',
  },
  backgroundImage: {
    position: 'absolute',
    width: '100%',
    height: '100%',
  },
  blurContainer: {
    width: '85%',
    height: '60%',
    borderRadius: 16,
    overflow: 'hidden',
  },
  content: {
    flex: 1,
    padding: 20,
    justifyContent: 'center',
  },
  title: {
    fontSize: 20,
    fontWeight: 'bold',
    marginBottom: 8,
  },
});

Backward compatibility is maintained on Android 12 and below with traditional rendering.


Best Practices: Unified Optimization Strategy

Multi-Layer Optimization Architecture

Here's how to leverage all Expo SDK 55 features together:

  1. Build Layer: EAS caching accelerates development cycles
  2. Runtime Layer: Hermes V1 improves execution performance
  3. UI Layer: Modal and blur optimization reduces jank
  4. Monitoring Layer: Expo Observe tracks production performance

Implementation checklist:

// Complete app.json configuration
{
  "expo": {
    "name": "MyRorkApp",
    "version": "1.0.0",
    "sdkVersion": "55",
    "plugins": [
      [
        "expo-build-properties",
        {
          "android": {
            "enableHermes": true,
            "buildToolsVersion": "34.0.0"
          },
          "ios": {
            "deploymentTarget": "13.0"
          }
        }
      ]
    ],
    "experiments": {
      "isModulesFunctionsEnabled": true
    }
  }
}

Looking back

Expo SDK 55 integrates Hermes V1, EAS build caching, react-native-screens 4.23.0, android-blur optimization, and Expo Observe into a comprehensive performance platform. Development speed and production quality can now coexist, making SDK 55 essential for medium to large Rork app projects.

Implementing the multi-layer optimization strategy progressively will substantially improve your users' experience.

Share

Thank You for Reading

Rork Lab is ad-free, supported entirely by members like you. We publish practical guides daily with implementation code, benchmarks, and production-ready patterns. If you've found it useful, we'd love to have you on board.

  • Copy-paste ready implementation code
  • New advanced guides published daily
  • $5/mo or $15 for lifetime access
View Membership →

If you found this article helpful, a small tip ($1.50) would mean a lot to us. Your support helps keep this site ad-free and covers server and hosting costs.

Related Articles

Dev Tools2026-08-09
Measuring Hermes Bytecode Delta Updates: One Added Module Cost 29x More Than One Changed Line
I measured OTA delta sizes against a 2.4MB Hermes bytecode bundle. Changing one line cost 2,104 bytes; adding one module cost 61,197. The widely repeated advice about stable module IDs turned out to matter least.
Dev Tools2026-07-10
Adding React Compiler to Expo Let Me Delete 41 Hand-Written memo Calls
I enabled React Compiler on Rork-generated React Native screens and measured the rerender counts with Profiler. Here is how I decided which memo and useCallback calls were safe to delete, how to find the components the compiler bailed out on, and how to catch regressions in CI.
Dev Tools2026-06-23
Why Your Prices Show as “¥1234” on Some Phones — A Formatting Layer That Doesn't Trust Intl Alone in Expo
Same code, yet one device shows “¥1,480” and another “¥1480.” In Expo / Hermes, Intl leans on each device's locale data, so output can drift by OS and engine. Here is a resilient formatting layer that centralizes currency, number, date, and timezone handling and falls back gracefully where Intl is incomplete — with working code.
📚RECOMMENDED BOOKS
Build a Large Language Model (From Scratch)
Sebastian Raschka
LLM Dev
Prompt Engineering for LLMs
Berryman & Ziegler
Prompting
AI Engineering
Chip Huyen
AI Eng
* Contains affiliate links
See all →