Toolset · TypeScript, Expo, TanStack Query
React Native
- React Native
- TypeScript
- Expo
React Native shares a TypeScript codebase across platforms. Our stack leans on Expo for the toolchain, fast native storage, and server-state that stays honest about at-least-once and stale data.
Where two tools compete, the one marked our default is what we reach for.
Toolchain
2 toolsNavigation
2 toolsThe standard navigation library — stacks, tabs, drawers. Our default.
File-based routing on top of React Navigation.
State & server state
3 toolsServer-state caching, invalidation, and background refetch — the honest way to manage remote data. Our default.
Minimal client-state store; avoid persisting tenant-scoped data unscoped.
Highly structured global state with strict unidirectional data flow, time-travel debugging, and a large ecosystem — excellent for massive apps where state interactions are complex and demand strict architecture. The trade-off is significant boilerplate and a steeper learning curve that slows simpler features. Decision rule: start with Zustand for its simplicity and speed; choose Redux only for massive apps with complex state interactions that truly benefit from its strict architecture.
Push notifications
1 toolexpo-notifications for the managed workflow, or @react-native-firebase/messaging for the bare workflow. Handle payloads with addNotificationResponseReceivedListener and navigate on tap via React Navigation. The bare workflow needs the platform setup — GoogleService-Info.plist (iOS) and google-services.json (Android) — per the React Native Firebase guide. Our default.
Local storage
2 toolsExtremely fast, synchronous key-value storage backed by memory mapping — significantly faster than AsyncStorage, and the right choice for performance-critical apps with frequent reads and writes. Our default over AsyncStorage.
The built-in, asynchronous key-value store. Fine for simple needs, but slower for frequent operations.
Security
4 toolsKeychain/Keystore-backed storage for tokens and secrets — the right home for auth tokens and short key-value secrets. Our default. On Android it uses EncryptedSharedPreferences (API 23+) and falls back to AES-encrypted SharedPreferences pre-API 23, so deployments targeting older APIs must account for that.
Keychain/Keystore-backed secure storage for the bare workflow when you're off Expo's module set.
Standard cryptographic operations — hashing and secure random bytes via the Web Crypto API. Our default for simple crypto needs.
Pin the server's public-key hash via expo-network or a custom HTTP client, keeping a fallback pin so certificate rotation doesn't lock users out.
Animations
1 toolUI-thread animations and gestures for 60fps interactions. Our default.
Testing
2 toolsUnit/component tests. Our default.
Grey-box end-to-end testing on device.
Background work
2 toolsexpo-background-fetch for periodic tasks, expo-task-manager for more complex background operations; for the bare workflow, react-native-background-timer. Respect the platform constraints (iOS background fetch, Android WorkManager). Our default.
Run heavy work off the JS thread on a worklet runtime, or offload to a native module — keep the main thread free.
Monitoring & observability
3 toolsCrashes, ANRs/hangs, performance, and release health for the JS and native layers together. Our default.
Firebase crash reporting via React Native Firebase; pairs well if you already use Firebase.
Desktop app for inspecting state, API calls, and logs during development.
CI/CD
4 toolsExpo's cloud build and store submission — signing and credentials managed for you. Our default.
CI for lint / typecheck / test on every push.
Over-the-air JS updates without a store release.
Store deploys for bare (non-Expo) workflows.
Linting & formatting
3 toolsBuilding on React Native?
We ship production React Nativewith exactly this stack. Tell us what you're building.
Start a conversation