Reqflow
Start here · first module
RN Setup & Dev Loop

Build an effective RN dev loop: Metro, Fast Refresh, device runtime, and debugging habits.

Open module →

// learning path

Recommended order

Start with RN setup and core UI, then keyboard and async UI patterns, then compare old bridge vs New Architecture, and follow through render pipeline, hooks, lists, images, navigation, lifecycle, offline sync, push, and OTA. Each module builds interview vocabulary on top of real builder intuition.

Intermediate build

06
Data Fetching & Async State

Async data fetching is UI design: loading states, cancellation for stale responses, caching, and error recovery that does not race.

Render loading and error states as first-class UI.

Open →
07
State Management Patterns

Separate local UI state, global client state, and server cache. Use the smallest container that solves the sharing problem.

Local state by default; global only when multiple screens need it.

Open →
08
Local Persistence Basics

Local persistence is your offline foundation: hydrate fast, version your cache, write updates safely, and reconcile later with conflict handling.

Hydrate locally for a fast, offline-friendly first render.

Open →
09
New Architecture (JSI, Fabric, TurboModules)

Four pillars: JSI (how JS talks to C++), Fabric (how UI commits to native), TurboModules (how native APIs load), and Codegen (how bindings stay typed). A button tap crosses all four.

JSI = direct C++ refs; Fabric = shadow tree + commit; TurboModules = lazy native APIs.

Open →
11
Render Pipeline (React → Native UI)

setState on React Native is not 'update the DOM.' It's JS render → reconciler diff → Fabric shadow tree → Yoga layout → native commit. Jank is paid at every stage, not just in JavaScript.

RN output is shadow tree + native views, not DOM.

Open →
12
Debugging & Profiling

Debug with a process: reproduce reliably, inspect state, profile JS vs UI thread, isolate one variable, verify in release on device.

Write a minimal repro before refactoring.

Open →
13
Hermes vs JavaScriptCore

Hermes ships precompiled bytecode for faster startup and lower memory. JavaScriptCore parsed source at runtime and was the legacy default before Hermes became standard in React Native.

Hermes optimizes startup and memory, not peak JIT throughput.

Open →
14
React Hooks in React Native

Hooks on RN follow the same rules as web, but the cost of mistakes is higher: unstable callbacks break FlatList row memoization, effects without cleanup cause fetch races, and fetching in render loops infinitely.

Hooks must run in consistent order every render.

Open →
15
FlatList & List Performance

FlatList virtualizes: only a window of rows mounts. getItemLayout, keyExtractor, memoized renderItem, and avoiding inline styles in rows are the interview checklist for 10,000-item feeds.

FlatList mounts a window, not the full dataset.

Open →
16
FlatList vs FlashList

FlatList is the core virtualized list. FlashList adds stricter recycling and requires estimatedItemSize, trading setup discipline for fewer blank frames on huge feeds.

FlatList first; FlashList when profiling demands it.

Open →
17
Gestures & Animated Basics

Gesture Handler recognizes touches; Animated handles simple native-driven motion; Reanimated moves gesture math to the UI thread.

RNGH delivers reliable gesture recognition.

Open →
19
Image Pipeline & Caching

Images flow through memory → disk → network tiers. FastImage and SDWebImage/Glide wrap native caches. Skeleton placeholders and size hints prevent layout shift and wasted decode work.

Images cache in memory, then disk, then network.

Open →
20
Navigation & Deep Links

Deep links parse URLs into route params, React Navigation resolves the screen stack, and cold start requires handling the initial URL separately from in-app Linking events.

Handle getInitialURL for cold start; addEventListener for warm.

Open →
21
Expo vs Bare Workflow

Expo optimizes time-to-first-screen with managed workflow and EAS. Bare RN gives full native control from day one. Modern Expo is not a walled garden, prebuild generates ios/android when you need custom native code.

Expo managed = fast start; bare = full native freedom.

Open →
22
App Lifecycle & AppState

RN apps move through active, background, and inactive states. Pause sync on background, flush drafts, queue push handling, and resume carefully, OS may kill the process anytime in background.

Listen to AppState; pause work when backgrounded.

Open →
24
Push Notifications (APNs & FCM)

Push flow: app registers FCM/APNs token → backend stores it → event triggers send → OS delivers → foreground/background/killed each behave differently → tap navigates via deep link.

Register and refresh FCM/APNs tokens on the server.

Open →
26
Testing React Native Apps

Test in layers: fast Jest unit tests, RNTL component tests with mocks, and a thin E2E smoke suite for money paths.

Many unit tests, fewer component tests, thin E2E smoke.

Open →

Advanced depth

10
Native Modules & Codegen

Adding native capability in New Architecture: write a TurboModule spec in TypeScript, let Codegen emit bindings, implement shared logic in C++ and thin platform layers in Swift/Kotlin, register via JSI, call from JS with getEnforcing.

TurboModule spec in TypeScript drives Codegen output.

Open →
18
Reanimated Worklets

Reanimated runs animation math on the UI thread via worklets and shared values, avoiding per-frame React re-renders and JS bridge traffic during gestures.

Worklets run on the UI thread, not in React render.

Open →
23
Offline Sync & Conflict Resolution

Offline-first: optimistic UI, local outbox queue, sync on reconnect, idempotent server APIs, and explicit conflict resolution, not 'hope the network returns.'

Optimistic UI needs rollback or failed-state on error.

Open →
25
Mobile Security Basics

Layer transport pinning, secure token storage, device integrity checks, and short-lived credentials. AsyncStorage is not a secrets vault.

Refresh tokens belong in secure storage, not AsyncStorage.

Open →
27
CI/CD & Store Release

Mobile release is PR gates, signed native builds, beta distribution, staged store rollout, and knowing when OTA is enough.

Block bad merges before expensive native builds.

Open →
28
OTA vs App Store Updates

OTA (EAS Update, CodePush) ships JavaScript bundle changes without store review. Native code, permissions, and SDK changes require a store build. Know what you can and cannot hotfix Friday at 6pm.

OTA updates JS/assets; native changes need store builds.

Open →

All modules

Filter by category or level, or browse the learning path above.

Category:
Level:
PlatformOpen →
RN Setup & Dev Loop

Your RN dev loop is Metro bundling, Fast Refresh behavior, device runtime execution, and a disciplined debug process.

Metro serves the JavaScript bundle your app runs.

BeginnerPipeline trace7m read~13 min
ArchitectureOpen →
Core Components & Layout

RN UI is a component tree that becomes native views. Layout is flexbox computed by Yoga, then committed by Fabric.

Yoga runs flexbox layout for RN views.

BeginnerPipeline trace7m read~13 min
PlatformOpen →
Forms & Keyboard Handling

Forms feel broken on mobile when keyboard, focus, and layout resizing are handled incorrectly. Plan for those UX edges.

Keyboard handling is a layout responsibility, not just a component choice.

BeginnerPipeline trace6m read~14 min
PlatformOpen →
Accessibility on Mobile

Accessible RN apps need labels, roles, logical focus, adequate touch targets, and real screen reader testing.

Icon buttons need accessibilityLabel.

BeginnerPipeline trace6m read~14 min
ArchitectureOpen →
Old Bridge vs New Architecture

The old React Native bridge serialized every JS→native call as async JSON. The New Architecture replaces it with JSI direct references, lazy TurboModules, and Fabric's C++ shadow tree, the three shifts every senior RN interview expects you to name.

Old bridge = async JSON queue; New Architecture = JSI direct refs.

BeginnerSide-by-side7m read~15 min
PlatformOpen →
Data Fetching & Async State

Async data fetching is UI design: loading states, cancellation for stale responses, caching, and error recovery that does not race.

Render loading and error states as first-class UI.

IntermediatePipeline trace8m read~16 min
PlatformOpen →
State Management Patterns

Separate local UI state, global client state, and server cache. Use the smallest container that solves the sharing problem.

Local state by default; global only when multiple screens need it.

IntermediateSide-by-side8m read~14 min
Offline & SyncOpen →
Local Persistence Basics

Local persistence is your offline foundation: hydrate fast, version your cache, write updates safely, and reconcile later with conflict handling.

Hydrate locally for a fast, offline-friendly first render.

IntermediatePipeline trace7m read~15 min
ArchitectureOpen →
New Architecture (JSI, Fabric, TurboModules)

Four pillars: JSI (how JS talks to C++), Fabric (how UI commits to native), TurboModules (how native APIs load), and Codegen (how bindings stay typed). A button tap crosses all four.

JSI = direct C++ refs; Fabric = shadow tree + commit; TurboModules = lazy native APIs.

IntermediatePipeline trace8m read~17 min
ArchitectureOpen →
Native Modules & Codegen

Adding native capability in New Architecture: write a TurboModule spec in TypeScript, let Codegen emit bindings, implement shared logic in C++ and thin platform layers in Swift/Kotlin, register via JSI, call from JS with getEnforcing.

TurboModule spec in TypeScript drives Codegen output.

AdvancedPipeline trace9m read~18 min
ArchitectureOpen →
Render Pipeline (React → Native UI)

setState on React Native is not 'update the DOM.' It's JS render → reconciler diff → Fabric shadow tree → Yoga layout → native commit. Jank is paid at every stage, not just in JavaScript.

RN output is shadow tree + native views, not DOM.

IntermediatePipeline trace8m read~17 min
PlatformOpen →
Debugging & Profiling

Debug with a process: reproduce reliably, inspect state, profile JS vs UI thread, isolate one variable, verify in release on device.

Write a minimal repro before refactoring.

IntermediatePipeline trace8m read~16 min
ArchitectureOpen →
Hermes vs JavaScriptCore

Hermes ships precompiled bytecode for faster startup and lower memory. JavaScriptCore parsed source at runtime and was the legacy default before Hermes became standard in React Native.

Hermes optimizes startup and memory, not peak JIT throughput.

IntermediateSide-by-side7m read~13 min
ArchitectureOpen →
React Hooks in React Native

Hooks on RN follow the same rules as web, but the cost of mistakes is higher: unstable callbacks break FlatList row memoization, effects without cleanup cause fetch races, and fetching in render loops infinitely.

Hooks must run in consistent order every render.

IntermediatePipeline trace9m read~20 min
PerformanceOpen →
FlatList & List Performance

FlatList virtualizes: only a window of rows mounts. getItemLayout, keyExtractor, memoized renderItem, and avoiding inline styles in rows are the interview checklist for 10,000-item feeds.

FlatList mounts a window, not the full dataset.

IntermediateDevice simulation8m read~16 min
PerformanceOpen →
FlatList vs FlashList

FlatList is the core virtualized list. FlashList adds stricter recycling and requires estimatedItemSize, trading setup discipline for fewer blank frames on huge feeds.

FlatList first; FlashList when profiling demands it.

IntermediateSide-by-side7m read~13 min
PerformanceOpen →
Gestures & Animated Basics

Gesture Handler recognizes touches; Animated handles simple native-driven motion; Reanimated moves gesture math to the UI thread.

RNGH delivers reliable gesture recognition.

IntermediateSide-by-side7m read~13 min
PerformanceOpen →
Reanimated Worklets

Reanimated runs animation math on the UI thread via worklets and shared values, avoiding per-frame React re-renders and JS bridge traffic during gestures.

Worklets run on the UI thread, not in React render.

AdvancedThread timeline8m read~17 min
PerformanceOpen →
Image Pipeline & Caching

Images flow through memory → disk → network tiers. FastImage and SDWebImage/Glide wrap native caches. Skeleton placeholders and size hints prevent layout shift and wasted decode work.

Images cache in memory, then disk, then network.

IntermediateDevice simulation7m read~15 min
PlatformOpen →
Navigation & Deep Links

Deep links parse URLs into route params, React Navigation resolves the screen stack, and cold start requires handling the initial URL separately from in-app Linking events.

Handle getInitialURL for cold start; addEventListener for warm.

IntermediatePipeline trace7m read~16 min
PlatformOpen →
Expo vs Bare Workflow

Expo optimizes time-to-first-screen with managed workflow and EAS. Bare RN gives full native control from day one. Modern Expo is not a walled garden, prebuild generates ios/android when you need custom native code.

Expo managed = fast start; bare = full native freedom.

IntermediateSide-by-side8m read~16 min
PlatformOpen →
App Lifecycle & AppState

RN apps move through active, background, and inactive states. Pause sync on background, flush drafts, queue push handling, and resume carefully, OS may kill the process anytime in background.

Listen to AppState; pause work when backgrounded.

IntermediateSync queue7m read~15 min
Offline & SyncOpen →
Offline Sync & Conflict Resolution

Offline-first: optimistic UI, local outbox queue, sync on reconnect, idempotent server APIs, and explicit conflict resolution, not 'hope the network returns.'

Optimistic UI needs rollback or failed-state on error.

AdvancedSync queue9m read~17 min
PlatformOpen →
Push Notifications (APNs & FCM)

Push flow: app registers FCM/APNs token → backend stores it → event triggers send → OS delivers → foreground/background/killed each behave differently → tap navigates via deep link.

Register and refresh FCM/APNs tokens on the server.

IntermediatePipeline trace8m read~16 min
ProductionOpen →
Mobile Security Basics

Layer transport pinning, secure token storage, device integrity checks, and short-lived credentials. AsyncStorage is not a secrets vault.

Refresh tokens belong in secure storage, not AsyncStorage.

AdvancedPipeline trace8m read~16 min
ProductionOpen →
Testing React Native Apps

Test in layers: fast Jest unit tests, RNTL component tests with mocks, and a thin E2E smoke suite for money paths.

Many unit tests, fewer component tests, thin E2E smoke.

IntermediatePipeline trace8m read~16 min
ProductionOpen →
CI/CD & Store Release

Mobile release is PR gates, signed native builds, beta distribution, staged store rollout, and knowing when OTA is enough.

Block bad merges before expensive native builds.

AdvancedPipeline trace8m read~16 min
ProductionOpen →
OTA vs App Store Updates

OTA (EAS Update, CodePush) ships JavaScript bundle changes without store review. Native code, permissions, and SDK changes require a store build. Know what you can and cannot hotfix Friday at 6pm.

OTA updates JS/assets; native changes need store builds.

AdvancedSide-by-side8m read~16 min