Software Mansion Aug 26, 2026

React Native Callkeep Alternatives in 2026

Article Summary

Paweł Gadomski from Software Mansion just solved one of React Native's messiest problems: getting WhatsApp-style incoming calls to actually work when your app is killed. The solution? Stop treating it as a library problem.

Building native calling in React Native means wrestling with CallKit, Android Telecom, FCM push conflicts, and APIs that weren't designed for cross-platform apps. Software Mansion built native calling directly into their Fishjam WebRTC platform SDK, handling the entire wake-from-killed-to-ringing flow so developers don't have to.

Key Takeaways

Critical Insight

Native calling is now part of Fishjam's React Native SDK with one provider component and one hook, eliminating the manual wiring between call UI libraries and WebRTC stacks.

The article reveals how VisionCamera frame processors can transform live call video with GPU shaders and on-device models before the track even publishes.

About This Article

Problem

Android apps can only use one FCM service slot, so call pushes and notification library pushes end up competing for the same channel. This causes messages to get lost. Meanwhile, lock-screen timers start counting from the wrong time, and calls drop when you try to answer them.

Solution

Software Mansion built native calling directly into Fishjam's React Native SDK. They added a VoIPProvider component and useVoIP hook that handle CallKit and Telecom natively. Non-call FCM messages get routed to expo-notifications, RN Firebase, or custom classes through voipFallbackMessagingService.

Impact

Developers can skip the long native setup checklist and just add one app.json config plugin entry on Expo instead. Timeouts are configurable: 45 seconds for missed calls, 60 seconds for outgoing calls, and 10 seconds for stalled media. Hold, mute, redial, CarPlay, and Android Auto all work automatically without extra wiring.