Staltz sees React Native as a way to combine ideas from web and native development, with JavaScript reshaping how mobile apps are built. He argues that its challenges extend beyond rendering, state, routing, and requests because teams also work across native APIs, languages, and tools.
Composable Native APIs
Speaker
Andre Staltz, a software developer known for Cycle.js, speaks at Callstack about managing native APIs in React Native through a composable architecture.
React makes rendering declarative, but APIs such as vibration, toasts, the clipboard, and text-to-speech often require imperative calls. Putting those calls in component lifecycle hooks or action creators works, Staltz says, but couples reusable components to singleton services.
Staltz defines composability with a practical test: a component should be useful when moved into its own package and imported elsewhere. His approach has components send requests upward, while singleton drivers handle the real effects, such as triggering vibration. This also allows apps to intercept requests and lets tests check events without a device or emulator.
Staltz describes bottom-up design as building from leaf components without needing to redesign them as the app grows. In Cycle.js, components follow the same pattern at every level: data flows down and requests bubble up. Each component is a function that takes streams of inputs and produces streams of outputs.
Staltz demonstrates the architecture in an alpha peer-to-peer social app, connecting a news feed and other components through streams. Ordinary React components can still be used inside it, while drivers handle native effects such as the Android status bar. He also suggests React Native's message-passing bridge could support similar interception and testing benefits.
Takeaways
- Keep imperative native API calls in singleton drivers so components can stay reusable.
- Send effect requests through the component hierarchy to make them interceptable and testable.
- Use the same component pattern from leaf to root to support bottom-up design.
- Model visual native features, such as status bars and toasts, as declarative outputs.
- Cycle.js can work alongside ordinary React components; migration need not require rewriting them.
Mentioned in this talk
Search inside this talk
What was claimed 7
- featurereact-native-node: Runs a real Node.js process in an app
“allows you to run a real Node.js process in your app”
YouTube Unverified1 source· Talk
- built
“I also wrote this package called react-native-node”
YouTube Unverified1 source· Talk
- builtAndre Staltz built React Native Elm
“I wrote the first commits for React Native Elm”
YouTube Unverified1 source· Talk
- integrates withCycle.js integrates with React Native
“how Cycle.js handles that together with React Native”
YouTube Unverified1 source· Talk
- featureCycle drivers: Pick up application events and execute requests for real
“It picks up events from an application and executes them for real.”
YouTube Unverified1 source· Talk
- featurestream-based component architecture: Components take many streams as input and produce many streams as output
“It's actually a function that goes from many streams to many streams.”
YouTube Unverified1 source· Talk
- builtAndre Staltz built React NativeDrivers for React Native
“I made some drivers for React Native that helped me build real apps.”
YouTube Unverified1 source· Talk






