Skip to content

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.

01

Toolchain

2 tools
Expoour default

Managed toolchain, OTA updates, and a huge module set. Our default entry point for new apps.

The React Native bundler.

02

Navigation

2 tools
React Navigationour default

The standard navigation library — stacks, tabs, drawers. Our default.

File-based routing on top of React Navigation.

03

State & server state

3 tools
TanStack Queryour default

Server-state caching, invalidation, and background refetch — the honest way to manage remote data. Our default.

Zustandour 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.

04

Push notifications

1 tool

expo-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.

05

Local storage

2 tools

Extremely 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.

06

Security

4 tools

Keychain/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.

07

Animations

1 tool

UI-thread animations and gestures for 60fps interactions. Our default.

08

Testing

2 tools

Unit/component tests. Our default.

Grey-box end-to-end testing on device.

09

Background work

2 tools

expo-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.

10

Monitoring & observability

3 tools
Sentryour default

Crashes, 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.

11

CI/CD

4 tools

Expo'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.

12

Linting & formatting

3 tools
ESLintour default

Linting with the React Native and typescript-eslint configs. Our default.

Prettierour default

Opinionated code formatting. Our default.

Type-checking as a CI gate — tsc --noEmit on every push.

Building on React Native?

We ship production React Nativewith exactly this stack. Tell us what you're building.

Start a conversation