◉RORK LABJP
●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Beta since 09/15 with no stable date yet; running projects in Expo Go has required login since 09/03●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…●GPT-6.1 SOL — Added to Rork's model menu (09-29) with Low, Medium and High effort; included on Pro and Max●SONNET 5.5 — Claude Sonnet 5.5 is selectable: strong at UI design and faster than Sonnet 5 (09-28)●SDK 58 — Beta since 09/15 with no stable date yet; running projects in Expo Go has required login since 09/03●WIDGET — A write-up traces an iOS widget that renders black only in production builds●OBSERVE — EAS Observe now records native crashes too (SDK 57.0.21 or later, 10/07)●NEW — My App Open Ad Only Showed When the App…
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.

Expo219React Native239Performance25Hermes9OptimizationMobile 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 $10 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-10-13
Before You Ship: Go Looking for Your Own Keys Inside the Exported Expo Bundle
A key can be missing from your source and still be sitting inside the finished app. I ran expo export on Expo SDK 57, searched the bundle with grep and a short Node script, and recorded which secrets show up and which don't.
⬡ Dev Tools2026-09-10
I Added a Dim Screen Button, and iPhones Stayed Dark After the App Was Closed
In expo-brightness, setBrightnessAsync applies only to the current activity on Android, but changes the device brightness itself on iOS. Here is why the cleanup burden falls on one platform only, and a hook that restores brightness through AppState.